c++ - ifstream.eof() - 在实际结束之前到达文件末尾

标签 c++ ifstream fread

我有一个大约 11.1G 的二进制文件,其中存储了一系列来自 Kinect 的深度帧。此文件中有 19437 帧。为了每次读取一帧,我在 fstream 中使用了 ifstream 但它达到了 eof 在文件真正结束之前。 (我只得到了前 20 帧,由于 eof 标志,函数停止了)

但是,可以使用 stdio 中的 fread 读取所有帧。

谁能解释一下这种情况?感谢您抽出宝贵时间回答我的问题。

这是我的两个函数:

// ifstream.read() - Does Not Work: the loop will stop after 20th frame because of the eof flag
ifstream depthStream("fileName.dat");
if(depthStream.is_open())
{
  while(!depthStream.eof())
  {
    char* buffer = new char[640*480*2];
    depthStream.read(buffer, 640*480*2);

    // Store the buffer data in OpenCV Mat

    delete[] buffer;
  }
}

// fread() - Work: Get 19437 frames successfully
FILE* depthStream
depthStream = fopen("fileName.dat", "rb");
if(depthStream != NULL)
{
  while(!feof(depthStream))
  {
    char* buffer = new char[640*480*2];
    fread(buffer, 1, 640*480*2, depthStream);

    // Store the buffer data in OpenCV Mat

    delete[] buffer;
}

再次感谢您抽出宝贵时间回答我的问题

最佳答案

您需要以二进制模式打开流,否则它会在看到第一个值为 26 的字节处停止。

ifstream depthStream("fileName.dat", ios_base::in | ios_base::binary);

至于为什么 26 比较特殊,就是 Ctrl-Z 的代码,它是用来标记文本文件结尾的约定。这背后的历史记录在Raymond Chen's blog中。 .

关于c++ - ifstream.eof() - 在实际结束之前到达文件末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15034012/

相关文章:

c++ - grpc & protobuf -- 错误:std::result_of<> 中没有名为 'type' 的类型

c++ - 如何在 MFC 中获取嵌入式 Web 浏览器控件的 HWND

c++ - ifstream读入二维数组时出现奇怪的字符

c++ - 如何读取带有unicode文件名c++的二进制文件?

c - read(2) 是 C89 规范的一部分吗?

c - fread 位置光标似乎没有按预期前进

c++ - 如何在 boost::spirit::qi 语法中实现#ifdef?

c++ - 你如何在 C++ 中搜索文档中的字符串?

c - 如何在 malloc 字符串上使用 fread

冲突声明的 C++ 标准定义