2013-02-22 13 views
7

Ho un file binario approssimativamente 11.1G in cui memorizza una serie di frame di profondità da Kinect. Ci sono 19437 frame in questo file. Per leggere un fotogramma per volta, io uso ifstream in fstream ma raggiunge EOF prima che il vero fine del file. (Ho preso solo i primi 20 fotogrammi, e la funzione si arresta a causa della eof bandiera)ifstream.eof() - la fine del file viene raggiunta prima della fine reale

Tuttavia, tutti i frame possono essere letti utilizzando fread in stdio invece.

Qualcuno può spiegare questa situazione? Grazie per il prezioso tempo dedicato alla mia domanda.

Qui sono i miei due funzioni:

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

Ancora una volta, grazie per il tempo prezioso per la mia domanda

+2

si apre il flusso C in modalità binaria, perché non si è aperto il flusso C++ in modalità binaria? 'ifstream depthStream (" fileName.dat ", std :: ios_base :: bin);' (Inoltre, cancellare e riacquistare il buffer ogni iterazione sembra un po 'sciocco, non è vero? E usare 'std :: vector' per il buffer .) –

+0

Vedere anche: http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong. Inoltre, probabilmente vorrai usare qualcosa come 'std :: vector buffer (size);' invece di 'buffer = new char [dimensione];' –

+0

Questo: 'while (! DepthStream.eof()' è sempre sbagliato Altre condizioni possono causare il fallimento di una lettura a parte la fine del file. –

risposta

13

è necessario aprire il flusso in modo binario, altrimenti si ferma al primo byte è vede con un valore di 26.

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

per quanto riguarda il motivo per cui 26 è speciale, è il codice per Ctrl-Z, che era una convenzione usata per segnare la fine di un file di testo. La storia dietro questo è stato registrato in Raymond Chen's blog.

+0

wait, stop al primo byte con un 26? Non ho mai sentito parlare di una cosa del genere. la modalità testo ha semplicemente tradotto '\ r \ n' in' \ n' su Windows, e non ha fatto nulla su linux/mac. [la mia ricerca Google] (https://www.google.com/search?q=C%2B% 2B% 20stream% 2026) non trova immediatamente alcuna connessione tra i flussi e "26" ... –

+1

@MooingDuck, vedere ad esempio http://stackoverflow.com/questions/15008907/c-cin-fails-when-readin g-more-than-127-ascii-values ​​ –

+5

@MooingDuck - questa è una cosa di Microsoft; ctrl-Z in un file di testo viene considerato come fine del file nella loro libreria C. –

Problemi correlati