Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取ifstream中从位置N开始的二进制字节?_C++ - Fatal编程技术网

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

C++ 读取ifstream中从位置N开始的二进制字节?,c++,C++,我正在将未知数量的结构写入一个二进制文件,然后将字节重新转换回结构。我知道如何写字节 我不确定如何迭代二进制文件。我想使用std::ifstream。在某种程度上,我必须将文件指针/索引增加sizeof(struct)字节,但我在网上能找到的唯一例子(在结构中读取二进制)是写入N个结构,然后读取N个结构,它们没有在文件上循环,增加任何文件索引 我想实现的伪代码是: std::ifstream file("test.txt", std::ifstream::binary); const size

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

我不确定如何迭代二进制文件。我想使用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);
}
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@user997112
read
返回
*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);