我正在将未知数量的结构写入二进制文件,然后将字节重新解释_转换为结构。我知道如何写字节。
我不确定如何遍历二进制文件。我想使用std :: ifstream。在某个时候,我必须将文件指针/索引增加sizeof(struct)个字节,但是我在网上可以找到的唯一示例(将二进制文件读入结构)是编写N个结构,然后读取N个结构,它们没有循环在文件上,增加文件索引。
我想要实现的伪代码是:
std::ifstream file("test.txt", std::ifstream::binary);
const size_t fileLength = file.size();
size_t pos = 0;
while(pos < fileLength)
{
MyStruct* ms = &(reinterpret_cast<MyStruct&>(&file[pos]));
// Do whatever with my struct
pos += sizeof(MyStruct);
}
更新:
我的结构是POD
答案 0 :(得分:1)
#include <fstream>
struct MyStruct{};
int main()
{
std::ifstream file("test.txt", std::ifstream::binary);
MyStruct ms;
//Evaluates to false if anything wrong happened.
while(file.read(reinterpret_cast<char*>(&ms),sizeof ms))
{
// Do whatever with my struct
}
if(file.eof())
;//Successfully iterated over the whole file
}
请确保不要执行以下操作:
char buffer[sizeof(MyStruct)];
file.read(buffer,sizeof(MyStruct));
//...
MyStruct* myStruct = reinterpret_cast<MyStruct*>(buffer);
它可能会起作用,但会破坏别名规则,并且行为不确定。如果您确实需要缓冲区(例如,对于小文件,则先将整个文件读入内存然后在该缓冲区上进行迭代可能会更快),那么正确的方法是:
char buffer[sizeof(MyStruct)];
file.read(buffer,sizeof(MyStruct));
//...
MyStruct myStruct;
std::memcpy(&myStruct,buffer,sizeof myStruct);