1

我一直很难写入二进制文件并回读。我基本上是在写这种格式的记录

1234|ABCD|efgh|IJKL|ABC

在写入此记录之前,我将写入整个记录的长度(using string.size())然后我将记录写入二进制文件ofstream,如下所示:

整数大小;

ofstream studentfile;
studentfile.open( filename.c_str(),ios::out|ios::binary );
studentfile.write((char*)&size,sizeof(int));
     studentfile.write(data.c_str(),(data.size()*(sizeof(char))));
     cout << "Added " << data << " to " << filename << endl;
     studentfile.close();

我在其他地方读到了这些数据

ifstream ifile11;
     int x;
     std::string y;
     ifile11.open("student.db", ios::in |ios::binary);
     ifile11.read((char*)&x,sizeof(int));
     ifile11.read((char*)&y,x);
     cout << "X " << x << " Y " << y << endl;

首先我将记录的长度读入变量 x,然后将记录读入字符串 y。问题是,输出显示 x 为 '0' 而 'y' 为空。

我无法弄清楚这一点。非常感谢能够研究这个问题并提供一些见解的人。

谢谢

4

2 回答 2

2

您不能以这种方式读取字符串,因为 astd::string实际上只是一个指针和一个大小成员。(尝试这样做std::string s; sizeof(s),无论您将字符串设置为什么,大小都将保持不变。)

而是将其读入临时缓冲区,然后将该缓冲区转换为字符串:

int length;
ifile11.read(reinterpret_cast<char*>(&length), sizeof(length));

char* temp_buffer = new char[length];
ifile11.read(temp_buffer, length);

std::string str(temp_buffer, length);
delete [] temp_buffer;
于 2013-09-20T06:06:09.100 回答
0

我知道我正在回答我自己的问题,但我严格认为这些信息会对每个人都有帮助。在大多数情况下,约阿希姆的回答是正确且有效的。但是,我的问题背后有两个主要问题:

1. The Dev-C++ compiler was having a hard time reading binary files.

2. Not passing strings properly while writing to the binary file, and also reading from the file. For the reading part, Joachim's answer fixed it all.

Dev-C++ IDE 没有帮助我。它错误地从二进制文件中读取数据,甚至没有使用 temp_buffer。Visual C++ 2010 Express 已正确识别此错误,并抛出运行时异常,避免我被误导。一旦我将所有代码放入一个新的 VC++ 项目中,它就会适当地向我提供错误消息,以便我可以修复所有问题。

所以,请不要使用 Dev-C++,除非你想遇到像这样的真正麻烦。此外,在尝试读取字符串时,Joachim 的答案将是理想的方式。

于 2013-09-21T06:55:03.483 回答