二进制读/写运行时故障

时间:2010-03-04 13:38:58

标签: c++ gcc file-io binary redhat

我看过二进制读取和用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 nameint age的简单结构。当我运行该程序时,它输出“Name:Bob”,因为我已经创建了一个程序来写入文件(因此该对象已经在文件名中)。

另外,为了输出名称,它还输出:

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

回溯:

...

记忆图:

...

中止

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

itoa_s()

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你说你把Person对象写成了一个文件。您是否尝试使用转储工具来查看文件中的内容是否符合您的预期?

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

答案 4 :(得分:0)

使用二进制IO时,必须修复大小。如果你在这里使用STL字符串,则会出现问题,因为STL字符串的大小是任意的。