通过在VS2022中创建一个项目,展示通过标准C++的文件流对象读写二进制数据文件。
在VS2022中创建C++空项目,
?
点击“创建”,完成空项目的创建。
在解决方案资源管理器视图中,右键单击项目名、添加、新建项,
添加名为“MyProject.cpp”的文件。
?
在文件中添加如下代码:?
?
#include <iostream>
#include <fstream>
// 定义结构体
#pragma pack (show) // 编译时以警告4810显示字节对齐个数
#pragma pack (push)
#pragma pack (1)
#pragma pack (show) // 编译时以警告4810显示字节对齐个数
typedef struct MyStruct
{
int a;
char b;
}MyStruct;
#pragma pack (pop)
#pragma pack (show) // 编译时以警告4810显示字节对齐个数
int main()
{
std::cout << "Hello!" << std::endl;
std::cout << "sizeof(MyStruct) is: " << sizeof(MyStruct) << std::endl;
MyStruct ms;
// 文件名
std::string fn = "d:\\temp\\My.dat";
// 向文件中写入二进制数据
std::ofstream ofs;
ofs.open(fn, std::ios::binary | std::ios::out | std::ios::trunc);
if (ofs.bad()) return -1;
for (int i = 0; i < 10; i++) {
ms.a = i + 1;
ms.b = (i+1) * 10;
ofs.write((char*)&ms, sizeof(ms));
}
ofs.close();
// 从文件中读取二进制数据
std::ifstream ifs;
ifs.open(fn, std::ios::binary | std::ios::in);
if (ifs.bad()) return -1;
// 获取文件大小
std::streampos fSize = 0;
ifs.seekg(0, std::ios::end);
fSize = ifs.tellg();
std::cout << "file size is: " << fSize << "Bytes." << std::endl;
// 读取并显示数据
for (ifs.seekg(0, std::ios::beg); ifs.tellg() < fSize; ) {
ifs.read((char*)&ms, sizeof(ms));
std::cout << "a: " << ms.a << " . b:" << (int)ms.b << std::endl;
}
ifs.close();
return 0;
}
编译链接后,程序运行结果如下:
从运行结果可以看出,实现了二进制数据读写。?
|