c++ - 如何一次从文件中读取多个字节?

标签 c++

我想一次从二进制文件中读取 8 字节 block ,直到到达文件末尾。为什么这段代码不起作用?有哪些替代方案?

// read a file into memory
#include <iostream>
#include <fstream>
using namespace std;

int main () {

  long long int * buffer;

  ifstream is;
  is.open ("test.txt", ios::binary );

  // allocate memory:
  buffer = new long long int;

  // read data:
  while(!is.eof())
      is.read (buffer,sizeof(long long int));
  is.close();


  delete[] buffer;
  return 0;
}

如果我将所有 long long int 替换为 char,代码将完美运行。

引用:代码改编自 www.cplusplus.com

最佳答案

问题是!eof :它告诉您最后操作是否命中eof,下一个操作是否会命中,以及最后一个操作是否失败!

在执行 IO 后测试流本身的真实性(或使用失败方法,这是相同的事情,否定):

while (is.read(buffer, sizeof(long long int))) {
  // use buffer
}
assert(is.fail());  // must be true

此外,您根本不必使用 new:

long long buffer;
// ...
is.read(reinterpret_cast<char*>(&buffer), sizeof buffer)
  // the reinterpret_cast is needed in your original code too

您的来源 cplusplus.com 在使用数据之前也无法检查读取是否成功。总的来说,我发现该网站非常适合列出参数、方法等,而对于其他大多数网站来说则很糟糕。


将它们放在一起,并提供一些示例输出:

#include <climits>
#include <fstream>
#include <iomanip>
#include <iostream>

int main () {
  using namespace std;

  ifstream in ("test.txt", in.binary);
  cout << hex << setfill('0');
  for (long long buffer;
       in.read(reinterpret_cast<char*>(&buffer), sizeof buffer);)
  {
    cout << setw(sizeof buffer * CHAR_BIT / 4) << buffer << '\n';
  }

  return 0;
}

关于c++ - 如何一次从文件中读取多个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869144/

相关文章:

c++ - 如何修复 SFML ln VS 2017 的错误?

c++ - 无法更改 netbeans 的系统变量 "Path"

c++ - 在类(class)内任何时候已知的类(class)成员

c++ - 如何在 C++ 应用程序中播放来自 Youtube 的 FLV 文件?

c++ - 动态分配的对象是否默认初始化?

c++ - JavaScript 上的 ChtmlView MFC 内存泄漏

c++ - C++代码中的汇编代码

c++ - 需要 QSortFilterProxyModel mapToSource 和 mapFromSource 帮助

c++ - 基于时间的(真正的)随机数?

c++ - 如何干净利落地结束 Lua 线程?