2013-02-22 101 views
7

我有一个大约11.1G的二进制文件,其中存储Kinect的一系列深度帧。该文件中有19437帧。要阅读每一个时间框架,我用在fstream的ifstream的,但它达到EOF文件的真正结束之前。 (我只得到了第一个20帧,并且功能停止,因为的EOF标志)ifstream.eof() - 在实际结束前达到文件结尾

然而,所有的帧可以通过标准输入输出而是采用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; 
} 

再次感谢您的宝贵时间,我的问题

+2

您以二进制模式打开C流,您为什么不以二进制模式打开C++流? 'ifstream depthStream(“fileName.dat”,std :: ios_base :: bin);'(另外,每次迭代删除并重新获得缓冲区看起来有点愚蠢吗?并且使用'std :: vector'作为缓冲区) – 2013-02-22 22:10:17

+0

另请参阅:http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong。另外,你可能想使用'std :: vector buffer(size);'而不是'buffer = new char [size];' – 2013-02-22 22:17:26

+0

这个:'while(!depthStream.eof()'总是错的。其他条件可能会导致读取失败,除了文件结尾 – 2013-02-22 23:25:05

回答

13

你需要以二进制方式打开流,否则会在第一个字节就停止与26

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

价值至于为什么26是特殊的,它是按Ctrl-Z这是一个约定用来标记文本文件的代码到底看到。背后的历史记录在Raymond Chen's blog

+0

等待,停在第一个字节与26?我从来没有听说过这样的事情。文本模式只是在Windows上将'\ r \ n'翻译成'\ n',并且在linux/mac上没有任何操作[我的Google搜索](https://www.google.com/search?q=C%2B% 2B%20stream%2026)没有立即发现流和“26”之间的任何连接... ... – 2013-02-22 22:12:15

+1

@MooingDuck,请参阅http://stackoverflow.com/questions/15008907/c-cin-fails-when-readin g-more-127-ascii-values – 2013-02-22 22:14:08

+5

@MooingDuck - 这是微软的一件事;文本文件中的ctrl-Z被视为C库中文件的结尾。 – 2013-02-22 22:42:40