ifstream.eof() - end of file is reached before the real end

不打扰是莪最后的温柔 提交于 2019-12-18 13:16:19

问题


I have a roughly 11.1G binary file where stores a series of the depth frames from the Kinect. There are 19437 frames in this file. To read one frame per time, I use ifstream in fstream but it reaches eof before the real end of the file. (I only got the first 20 frames, and the function stops because of the eof flag)

However, all frames can be read by using fread in stdio instead.

Can anyone explain this situation? Thank you for precious time on my question.

Here are my two functions:

// 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;
}

Again, thank you for precious time on my question


回答1:


You need to open the stream in binary mode, otherwise it will stop at the first byte it sees with a value of 26.

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

As for why 26 is special, it's the code for Ctrl-Z which was a convention used to mark the end of a text file. The history behind this was recorded in Raymond Chen's blog.



来源:https://stackoverflow.com/questions/15034012/ifstream-eof-end-of-file-is-reached-before-the-real-end

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!