读取二进制文件时如何输出?

时间:2019-07-13 17:12:03

标签: c++ fstream iostream

我已经创建了一个二进制文件“ index.dat”。它仅包含一个整数列表。我想检查文件中存在的最后一个整数。为此,我将文件指针放在最后一个整数处并读取它。当前,我的文件具有从0到4的整数,但输出始终为6。

我该如何解决这个问题?

#include<iostream>
#include<fstream>
using namespace std;
int main()
{   int i;
    ifstream infile;
    infile.open("index.dat",ios::binary|ios::in);
    if(infile.is_open())
    {   infile.seekg(sizeof(i),ios::end);
        infile.read(reinterpret_cast<char*>(&i),sizeof(i));
        cout<<i;
    }
    infile.close();
}

1 个答案:

答案 0 :(得分:0)

Igor Tandetnik在comment中明确了这一点:

  

您正在尝试查找文件的sizeof(i)个字节过去结尾。这个   当然会失败。随后的read也失败,然后您打印   未初始化的变量。从头寻找时,您需要否定的   偏移量。 — Igor Tandetnik 18小时前

所以不是

infile.seekg(sizeof(i),ios::end);

您需要做类似的事情

infile.seekg(-static_cast<streamoff>(sizeof(i)), ios_base::end);

(强制转换为streamoff的目的是确保我们不对未签名的值应用-,导致产生非常大的正值。streamoff已签名,{{ 1}}保证为ifstream::off_type。)