2010-03-04 122 views
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; 

人是含string nameint age一个简单的结构。当我运行程序时,输出“Name:Bob”,因为我已经创建了一个写入文件的程序(所以对象已经在文件名中)。

除了输出也输出名称:

* glibc的检测*方案:双免费OG腐败(fastttop):***

回溯:

...

存储器映射:

...

中止

+1

不要重新键入代码,它可以引入错误。 __Cut和Paste__代码。对象的二进制读取/写入仅在结构不包含指针时才有效。此规则必须递归应用于所有成员。因此,如果任何成员或成员成员或成员成员是一个指针,这将打破。如果没有关于人的更多信息,很难说它是否真的有效。 – 2010-03-04 13:50:51

+0

向我们展示Person的声明。 – 2010-03-04 13:56:25

+0

请记住,允许编译器在结构,类和联合中的字段之间插入填充。另一个问题是,字符串通常必须为它们分配空间,读入该空间,然后分配给结构,*除非文本字段是固定大小*。 – 2010-03-04 17:27:01

回答

3

Person结构中的名称字符串是字符数组还是STL字符串?由于数据格式不可串行化(包含指针),因此无法通过二进制读取数据填充STL字符串(包含指针)

0

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

序列化类通常需要比转储内存表示更多的工作。

+0

但如果它是char名字[100],那可能会起作用。 – 2010-03-04 14:01:41

0

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

你也试过,而不是使用字符串,使用普通字符(如@bdk指出)?

1

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

你也可以有一个或几个构造函数中的人:

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

那么,当您从文件中提取数据,你只需要调用与数据的构造。

0

当您使用二进制IO时,大小必须是固定的。如果你在这里使用STL字符串,它会有问题,因为STL字符串的大小是任意的。