是否从ifstream中的位置N开始读取二进制字节?

时间:2019-05-08 13:16:35

标签: c++

我正在将未知数量的结构写入二进制文件,然后将字节重新解释_转换为结构。我知道如何写字节。

我不确定如何遍历二进制文件。我想使用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

1 个答案:

答案 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);