C++ 读取ifstream中从位置N开始的二进制字节?
我正在将未知数量的结构写入一个二进制文件,然后将字节重新转换回结构。我知道如何写字节 我不确定如何迭代二进制文件。我想使用std::ifstream。在某种程度上,我必须将文件指针/索引增加sizeof(struct)字节,但我在网上能找到的唯一例子(在结构中读取二进制)是写入N个结构,然后读取N个结构,它们没有在文件上循环,增加任何文件索引 我想实现的伪代码是:C++ 读取ifstream中从位置N开始的二进制字节?,c++,C++,我正在将未知数量的结构写入一个二进制文件,然后将字节重新转换回结构。我知道如何写字节 我不确定如何迭代二进制文件。我想使用std::ifstream。在某种程度上,我必须将文件指针/索引增加sizeof(struct)字节,但我在网上能找到的唯一例子(在结构中读取二进制)是写入N个结构,然后读取N个结构,它们没有在文件上循环,增加任何文件索引 我想实现的伪代码是: std::ifstream file("test.txt", std::ifstream::binary); const size
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);
}
std::ifstream文件(“test.txt”,std::ifstream::binary);
const size_t fileLength=file.size();
大小\u t pos=0;
while(pos
更新:
我的结构是POD怎么样?@Scheff然后把我的位置传给seekg?我也需要istream::read()吗?不,你需要传递
pos*sizeof(MyStruct)
然后读入struct,假设你的struct是POD或类似的std::fstream
不支持文件映射,所以你必须在任何情况下使用read()
或类似的东西。seekg()
可以用来定位“读取头”一条小溪。它以字节为单位计数。要读取一个字节数,请记住。请详细说明它是否会破坏别名?@ USER 77112,我理解上面的代码是非法的,因为<代码> MyStult没有指向一个对象:“代码> MyStult类型,C++禁止两个不同类型的指针指向同一个内存。类型char*
有一个例外,它可以指向其他类型的对象。但据我所知,这只是单向的。所以MyStruct*
不能指向char
对象。包含我认为应该支持我的声明的标准的相关引用。还有有效的reinterpret\u cast
s(非标准)规则。特别是,类型别名段落也说明了期望值,MyStruct
不是其中之一。但是,如果有谁有更好的知识可以澄清这一点,我将不胜感激。谢谢!我只是在等待一个过程完成,然后我将尝试上面的方法。我不会忘记接受你的回答later@user997112read
返回*this
并调用this->setstate()。然后将ifstream
转换为bool。如果由于任何原因导致读取失败,它会设置failbit
,可能还会设置其他。这使得ifstream
object假->循环中断。检查eofbit
意味着循环中断,因为文件结束->所有结构都已成功读取。如果未设置eofbit
,则不会读取所有结构。“这是否有效地证明了while循环没有过早中断?”是的。此外,此代码假定文件大小是sizeof(MyStruct)
的倍数。
#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);