C++ 通过解引用迭代器将向量写入文件
我正在通过迭代器将vector的内容作为休止符写入一个文件C++ 通过解引用迭代器将向量写入文件,c++,visual-c++,vector,stl,iterator,C++,Visual C++,Vector,Stl,Iterator,我正在通过迭代器将vector的内容作为休止符写入一个文件 for(vector<Student>::iterator itr=vec.begin();itr!=vec.end();itr++){ out.write((char*)itr,sizeof *itr); } 工作正常。 那么为什么我不能直接使用itr呢?为什么我需要取消它的引用并重新获取它的地址 您不能像这样一个字节一个字节地序列化复杂对象,但您的尝试甚至没有尝试这样做 第一个示例尝试使用迭代器,将其转换为ch
for(vector<Student>::iterator itr=vec.begin();itr!=vec.end();itr++){
out.write((char*)itr,sizeof *itr);
}
工作正常。
那么为什么我不能直接使用itr呢?为什么我需要取消它的引用并重新获取它的地址 您不能像这样一个字节一个字节地序列化复杂对象,但您的尝试甚至没有尝试这样做 第一个示例尝试使用迭代器,将其转换为
char*
(这是完全不合理的),然后将sizeof(Student)
值的字节从该不合理的指针开始写入文件
第二个示例绕过了告诉您错误的有用的编译器错误,并强制转换。当然,你会得到一个结果,但这完全是一个毫无意义的结果,你的程序甚至可能崩溃
首先,您应该尝试序列化
Student
对象,而不是指向它们的迭代器;其次,除非它们是非常简单的对象,并且您知道自己在做什么,否则您仍然需要比将其组件字节写入文件更智能的序列化逻辑。了解对齐、填充、尾端、间接……反引用itr提供的是一个学生,而不是指针。这是序列化对象的错误方法。特别是,如果您的对象有任何虚拟成员,则稍后读回该对象将导致对象具有错误的vtable。您必须编写一个函数来逐个输出每个成员。对不起。@juanchopanza是的,取消对itr的引用会给我一个学生,但记下它的地址不会再给我itr吗?那么itr和&(*itr)之间有什么区别呢?@Neil Kirk好的。我会试试这个。这有什么好处?好的。那么你能给出一个最好/安全的方法来序列化一个向量或者一个资源来了解更多关于这方面的信息吗。这会很有帮助的。是的,当然。谢谢上面的答案中的一些关键字。这将缩小我的搜索范围。非常感谢。
out.write( (char*)&(*itr),sizeof *itr);