【问题标题】:Missing data when reading binary file in C++在 C++ 中读取二进制文件时丢失数据
【发布时间】:2014-02-20 08:14:59
【问题描述】:
vector<byte> h;
ifstream fin(file.c_str(), ios::binary);
if(!fin)
    return false;
byte b;
while(fin >> b)
    h.push_back(b);

h 的长度为 4021,而原始文件长度为 4096 字节。但是下面的代码给出了一个 4096 字节的字符串。为什么?

ostringstream sout;
sout << fin.rdbuf();
string s = sout.str();

更新:

@user2079303 解决了我的问题,但任何其他方式来执行阅读任务。太容易弄错了。

【问题讨论】:

  • 您能否缩短文件,使 bas64 编码的版本足够短,以便将其添加到问题中,同时仍然显示问题?
  • 你确定原始文件长度是 4096 字节吗?某些文件系统的默认块大小为 4096 字节。在通常的文件系统中,任何小于块大小的文件都将占用一个块的硬盘空间。
  • @user2079303 是的,正好是 4096 字节。丢失的数据在中间某处。我使用fin.tellg() 输出当前位置。发现当我得到 2000 字节时,向量长度是 1995。
  • byte 类型从何而来?
  • @Oswald windows.h 可能定义了一个像#define unsigned char byte 这样的微。我正在使用 win32 编程。

标签: c++ fstream ifstream


【解决方案1】:

当逐个字符读取输入流时(你的字节是字符,对吗?),标准流默认忽略空格。您可以使用std::noskipws 停止忽略它们。

fin >> std::noskipws >> b;

注意:ios::binary 对这种行为没有影响,尽管人们可能期望如此。据我所知,它只会禁用翻译行尾。

如果您不想担心处理,您可以使用满足UnformattedInputFunction 的函数。 cppreference 有一个很好的例子,说明如何使用istream::read 读取二进制文件。

【讨论】:

  • 但是执行任务的任何其他方式。这样我很容易忘记。
  • @zoujyjs:另一种方法是使用istream::read,它不那么漂亮,但不像流操作符那样处理输入,而且可能更快,因为你可以读取整个文件一口气而不是一个字节一个字节。
  • 上帝保佑这个人,我已经为这个问题苦苦挣扎了 2 天。
猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2017-10-01
相关资源
最近更新 更多