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
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 .) –
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];' –
Questo: 'while (! DepthStream.eof()' è sempre sbagliato Altre condizioni possono causare il fallimento di una lettura a parte la fine del file. –