通过取消引用迭代器将Vector写入文件

Writing Vector to file by dereferencing iterator

本文关键字:Vector 文件 迭代器 取消 引用      更新时间:2023-10-16

我正在通过迭代器将向量的内容写入一个文件中,作为空闲

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

由于不存在合适的转换函数,它给出了编译时错误。但当我取消引用itr并将其地址记为以下时

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

它运行良好。为什么我不能直接使用itr?为什么我需要取消引用它并重新获取它的地址?

您不能像这样逐个字节地串行化复杂对象,但您的尝试甚至没有尝试做到这一点!

您的第一个示例尝试使用迭代器,将其强制转换为char*(这是完全无意义的),然后将从该无意义指针开始的相当于sizeof(Student)的字节写入文件。

第二个例子绕过了告诉您错误的有用编译器错误,强制强制执行强制转换。当然,你会得到一个结果,但这完全是一个胡说八道的结果,你的程序甚至可能崩溃。

首先,您应该尝试序列化Student对象,而不是指向它们的迭代器。其次,除非它们是非常简单的对象,并且您知道自己在做什么,否则您仍然需要比将其组件字节写入文件更智能的序列化逻辑。了解对齐、填充、端序、间接。。。。