我看过二进制读取和用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 name
和int age
的简单结构。当我运行该程序时,它输出“Name:Bob”,因为我已经创建了一个程序来写入文件(因此该对象已经在文件名中)。
另外,为了输出名称,它还输出:
*检测到glibc * 程序:双重免费og腐败(fastttop):***
回溯:
...
记忆图:
...
中止
答案 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字符串的大小是任意的。