二进制文件不是以 ASCII 代码存放数据的,它将内存中数据存储形式不加转换地传送到
磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节
中的二进制形式的信息,因此它又称为字节文件。
对二进制文件的操作需要先打开文件,用完后要关闭文件。在打开时要用 ios::binary
指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以
是既能输入又能输出的文件。这是和 ASCII 文件不同的地方。
用成员函数 read 和 write 读写二进制文件:
对二进制文件的读写主要用 istream 类的成员函数 read 和 write 来实现。这两个成员函
数的原型为
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);
字符指针 buffer 指向内存中一段存储空间。len 是读写的字节数。调用的方式为:
a. write(p1,50);
b. read(p2,30);
上面第一行中的 a 是输出文件流对象,write 函数将字符指针 p1 所给出的地址开始的 50 个
字节的内容不加转换地写到磁盘文件中。在第二行中,b 是输入文 件流对象,read 函数从
b 所关联的磁盘文件中,读入 30 个字节(或遇 EOF 结束),存放在字符指针 p2 所指的一段空
间内。
class Student
{
public:
Student(int i, char n[15]) { id = i; strcpy_s(name,strlen(n)+1,n); };
~Student() {}
void printT() {
cout << id << ends << name << endl;
}
private:
int id;
char name[15];
};
void main(){
//写操作
ofstream fout("Student_Infor.dat",ios::out |ios::binary);
if (!fout)
{
cout << "Unable to open " << endl;
abort();
}
Student S1(1, "Mr");
Student S2(2, "Miss");
Student S3(3, "Jack");
Student S4(4, "Marry");
Student S5(5, "Like");
Student S6(6, "Famry");
char s = '\n';
fout.write((char *)&S1, sizeof Student);
fout.write((char *)&S2, sizeof Student);
fout.write((char *)&S3, sizeof Student);
fout.write((char *)&S4, sizeof Student);
fout.write((char *)&S5, sizeof Student);
fout.write((char *)&S6, sizeof Student);
fout.close();
//读操作
ifstream fin("Student_Infor.dat",ios::in | ios::binary);
if (!fin)
{
cout << "Unable to open " << endl;
abort();
}
Student S(0,"0");
while (!fin.eof())
{
fin.read((char *)&S, sizeof(Student));
if (fin.eof())break;
S.printT();
}
}
二进制文本: