2

我已经查看了 C++ 中的二进制读写对象,但遇到了一些问题。它“有效”,但此外我得到了大量的错误/“信息”输出。

我所做的是

Person p2;

std::fstream file;
file.open( filename.c_str(), std::ios::in | std::ios::out | std::ios::binary );
file.seekg(0, std::ios::beg );
file.read ( (char*)&p2, sizeof(p2));
file.close();
std::cout << "Name: " << p2.name;

Person 是一个包含string nameand的简单结构体int age。当我运行程序时,它会输出“名称:鲍勃”,因为我已经编写了一个程序来写入文件(因此对象已经在文件名中)。

除了输出名称外,它还输出:

* 检测到 glibc *程序:双重免费 og 损坏(fastttop):***

回溯:

...

内存映射:

...

中止

4

5 回答 5

3

Person 结构中的名称字符串是字符数组还是 STL 字符串?您不能通过二进制读取数据来填充 STL 字符串,因为数据格式不可序列化(包含指针)

于 2010-03-04T13:45:42.693 回答
1

看看您如何将信息写入文件以及如何Person构建结构将会很有趣。
如果您对文件是纯文本没有任何问题,我的建议是使用string::c_str()(返回 const char*)以及使用itoa()itoa_s()将整数作为 char* 写入文件。

您还可以在 Person 中拥有一个或多个构造函数:

Person(const std::string& name, int age);  
Person(const char* name, int age);

然后,当您从文件中提取数据时,您只需使用该数据调用构造函数。

于 2010-03-04T13:57:21.640 回答
0

p2.name 是一个 char* 并且您正在写入和读取指针值,而不是它所指向的值。或者 p2.name 是一种更复杂的类型,例如 std::string ,它使用具有相同问题的内部指针。

序列化类通常需要更多的工作,而不仅仅是转储内存表示。

于 2010-03-04T13:47:14.810 回答
0

您说您将 Person 对象写入文件。您是否尝试使用转储工具来查看文件中的内容是否符合您的预期?

您是否也尝试过使用普通字符而不是使用字符串(正如@bdk 指出的那样)?

于 2010-03-04T13:54:11.440 回答
0

使用二进制 IO 时,大小必须固定。如果您在此处使用 STL 字符串,则会出现问题,因为 STL 字符串的大小是任意的。

于 2010-03-04T14:40:59.380 回答