2014-09-23 41 views
0

我写向量的内容到一个文件通过迭代器文件作为休耕写作载体,以提领迭代器

for(vector<Student>::iterator itr=vec.begin();itr!=vec.end();itr++){ 
    out.write((char*)itr,sizeof *itr); 
} 

它给编译时错误,因为没有合适的转换功能exists.But当我提领ITR并采取其地址如下

out.write((char*)&(*itr),sizeof *itr); 

其工作正常。 那么为什么我在这里不能直接使用itr?为什么我需要解除引用并再次使用它的地址?

+2

解除引用'itr'为您提供'Student',而不是指针。 – juanchopanza 2014-09-23 19:13:27

+0

这是序列化对象的错误方法。特别是,如果您的对象具有任何虚拟成员,稍后读取对象将导致具有不良vtable的对象。 – cdhowie 2014-09-23 19:16:59

+0

您必须编写一个函数逐个输出每个成员。抱歉。 – 2014-09-23 19:19:15

回答

1

你不能只是逐字节地串行化这样的复杂对象,但你的尝试甚至不尝试这样做!

你的第一示例尝试采取迭代,将它转换为一个char*(这是完全没有意义的),则写sizeof(Student)值得开始在该无意义指针到一个文件中的字节数。

你的第二个例子绕过了有用的编译错误,告诉你有关你的错误,强制演员。当然,你会得到一个结果,但这完全是无意义的结果,你的程序甚至可能会崩溃。首先,你应该尝试序列化对象,而不是指向它们的迭代器,其次,除非它们是非常简单的对象,并且你知道自己在做什么,否则你仍然需要很多更多的智能串行化逻辑,而不仅仅是将其组件字节写入文件。了解对齐,填充,字节顺序,间接...

+0

好的。所以你可以给一个最好/安全的方法来序列化一个载体或可能的资源,以了解更多关于this.That会有帮助。 – bhushanblaster 2014-09-23 20:22:47

+1

@bhushanblaster谷歌找到像一千万个结果.... – 2014-09-23 20:27:15

+0

是啊sure.thanks一些关键字,但从上面answer.It将缩小我的搜索。非常感谢。 – bhushanblaster 2014-09-23 20:38:38