我遇到了用c ++编写.dat文件的代码。
我无法理解这两行......这些如何运作?
outfile.write(reinterpret_cast<char*>(&pers), sizeof(pers));
ofstream outfile("PERSON.DAT",ios::app| ios::binary);
#include <fstream> //for file streams
#include <iostream>
using namespace std;
class person //class of persons
{
protected:
char name[80]; //person’s name
short age; //person’s age
public:
void getData() //get person’s data
{
cout <<"Enter name: "; cin >> name;
cout <<"Enter age: "; cin >> age;
}
};
int main()
{
char ch;
person pers; //create a person
ofstream outfile("PERSON.DAT",ios::app| ios::binary);
do {
pers.getData(); //get data for person
outfile.write(reinterpret_cast<char*>(&pers), sizeof(pers));
cout <<"Enter another person (y/n)? ";
cin >> ch;
} while (ch == 'y');
//create ofstream object
//write to it
return 0;
}
答案 0 :(得分:3)
ofstream outfile("PERSON.DAT",ios::app| ios::binary);
从第二行开始,这将创建一个输出文件流,然后使用两种模式的组合打开一个名为“PERSON.DAT”的文件;追加和二进制。这意味着发送到输出流的任何数据都将附加到文件中的现有数据,您实际上是将数据添加到文件而不是覆盖它。二进制模式指定写入文件的任何数据都将按原样解释。在Windows中有一种称为文本模式的模式,其中某些字符(如'\ n')被翻译成它们的Windows等价物。二进制模式是标准模式,它只是意味着您发送到输出流的任何内容都是在没有修改的情况下写入的。
outfile.write(reinterpret_cast<char*>(&pers), sizeof(pers));
此命令将 pers 对象写入输出文件。 write()方法需要两个参数;第一个是指向要写入文件的一系列字节的指针,第二个是指示要写入的系列的字节数的整数。 reinterpret_cast()函数会将指向person对象的指针从 person * 转换为 char * ,这是写入所需的参数类型方法。 sizeof()只是一个函数,它以字节为单位获取对象的大小,如上所述, write()也是如此。
答案 1 :(得分:0)
它们只是逐字节地写入内存结构,从对象在内存中开始的位置开始,并且对象的大小就像它只是一堆char
一样。
这不是有史以来最精彩的想法,作者可能在某些时候面临无法预料的复杂情况。