gpt4 book ai didi

c++ - 读取 ifstream 中从位置 N 开始的二进制字节?

转载 作者:行者123 更新时间:2023-11-30 04:47:51 24 4
gpt4 key购买 nike

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

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

最佳答案

#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);

关于c++ - 读取 ifstream 中从位置 N 开始的二进制字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56041755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com