以二进制形式读写文件,是C++中读写文件的形式之一,步骤与存储读出文本文件基本相同,但也有需要注意之处。本文以小程序形式举例说明。
相关步骤及代码、注释如下:
一、头文件部分
#include <iostream>
#include <fstream> // ofstream、ifstream类必须包含的头文件
#include <string>
using namespace std;
二、定义一个结构体作为二进制文件存取数据的类型
struct myStruct
{
char myChar[31]; //字符串
int myInt; //整数
};
说明:此处之所以使用自定义结构体并使用char、int等基本类型,因为写入string类等类对象,其写入文件中的数据包括了动态开辟的指针,读取时容易出错。
三、定义全局数组变量,用于存储读取的数据
struct myStruct retData[3];
四、写入磁盘子程序
void Write( myStruct* pMyStruct)
{
string filename = "myData.dat"; //文件名
ofstream ofs; //声明写文件对象
ofs.open(filename, ios::out|ios::trunc | ios::binary);
//参1 文件名 参2 写方式|清空文件或新建|二进制方式
if (!ofs.is_open()) //检测是否正常打开
{
cout << "打开文件" << filename << "失败。\n";
return;
}
for (int i = 0; i < 3; i++) { //通过循环,依次存入各数据块
ofs.write((const char*)pMyStruct, sizeof(myStruct));
pMyStruct++;
}
ofs.close(); // 关闭文件
cout << "以二进制方式写入文件操作完成。。。\n";
}
五、从磁盘文件读取数据子程序
void Read()
{
string filename = "myData.dat"; //文件名
ifstream ifs; //声明读文件对象
ifs.open(filename, ios::in | ios::binary);
//参1 文件名 参2 读方式|二进制方式
if (!ifs.is_open())
{
cout << "打开文件" << filename << "失败。\n";
return;
}
myStruct temp;
int n = 0;
while (ifs.read((char*)&temp, sizeof(temp)))
//依次读入文件中个数据块
{
strcpy(retData[n].myChar, temp.myChar);
//此处若直接用等号赋值会报错:“表达式必须是可修改的左值错误”
retData[n].myInt=temp.myInt;
n++;
}
ifs.close(); // 关闭文件,fin对象失效前会自动调用close()。
cout << "读取二进制文件操作完成。。。\n";
}
六、调用举例
int main()
{ myStruct data[3] = { {"天AAAA",100}, {"津BBBB",200}, {"市CCCC",300} };
Write(data);
Read();
for (int i = 0; i < 3; i++)
{
cout << retData[i].myChar << " " << retData[i].myInt << endl;
}
system("pause");
return 0;
}
七、执行结果
/*
以二进制方式存入文件操作完成。。。
读取二进制文件操作完成。。。
天AAAA 100
津BBBB 200
市CCCC 300
请按任意键继续. . .
*/