2013-02-22 24 views
7

私はKinectから一連の深度フレームを格納する約11.1Gのバイナリファイルを持っています。このファイルには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'を使います) –

+0

参照:http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong。さらに、 'buffer = new char [size];の代わりに' std :: vector buffer(size); 'のようなものを使用したいと思うかもしれません –

+0

これは' while(!depthStream.eof() 'は常に間違っています –

答えて

13

に貴重な時間をありがとうございました26は特別である理由については26

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

の値を見て、それがテキストファイルの終わりをマークするために使用される慣例だったのCtrl-Z用のコードです。この背後にある履歴はRaymond Chen's blogに記録されています。

+0

待って、最初のバイトで26で停止しますか? \ n \ nをWindows上で '\ n 'に翻訳するだけで、linux/macでは何もしませんでした。[私のGoogle検索](https://www.google.com/search?q=C%2B% 2B%20stream%2026)はストリームと "26"との間の接続を直ちに見つけることはできません... –

+1

@MooingDuck、例えばhttp://stackoverflow.com/questions/15008907/c-cin-fails-when-readin g-more-127-asciiの値 –

+5

@MooingDuck - これはMicrosoftのものです。テキストファイルのctrl-Zは、Cライブラリのファイルの終わりとして扱われます。 –

関連する問題