2013-02-22 17 views
7

Yaklaşık 11.1G ikili dosyam var, burada bir dizi derinlik karesini Kinect'ten depolar. Bu dosyada 19437 çerçeve var. zaman başına bir kare okumak için, ben ifstream fstream kullanmak ama dosyanın gerçek sonundan önce eofulaşır. (Yalnızca ilk 20 kare var ve fonksiyon nedeniyle durur eof bayrak)ifstream.eof() - dosyanın sonuna gerçek sonlanmadan önce ulaşılır

Ancak, tüm çerçeveler yerine stdio fread kullanılarak okunabilir.

Bu durumu açıklayan var mı? Sorumu değerli zaman ayırdığınız için teşekkür ederim. aksi takdirde ilk bayt o durur, yine

// 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 akışını ikili modda açarsınız, neden ikili modda C++ akışını açmadınız? ifstream depthStream ("fileName.dat", std :: ios_base :: bin); '(Ayrıca, her yineleme arabelleği silme ve yeniden sorgulama biraz saçma gibi görünüyor değil mi? Ve arabellek için' std :: vector' kullanma .) –

+0

Ayrıca bkz. Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong. Buna ek olarak, muhtemelen std :: vector arabelleği (boyut); 'yerine buffer = new char [size]; –

+0

gibi bir şey kullanmak istersiniz. Bu: while (! DepthStream.eof()' her zaman yanlıştır Diğer koşullar, dosyanın sonuna kadar okunamaya neden olabilir –

cevap

13

Sen ikili modda Akışı açmak gerekir benim soru üzerine kıymetli zaman için teşekkür ederiz: Burada

benim iki fonksiyonlardır 26 özel olmasının nedeni, bu bir kongre bir metin dosyasının sonunun geldiğini oldu Ctrl-Z için kod gelince 26'dan

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

değeriyle görür. Bunun arkasındaki tarih Raymond Chen's blog numaralı telefondan kaydedilmiştir.

+0

bekle, 26 ile ilk baytta durun, hiç böyle bir şey duymadım. metin modu, yalnızca windows'ta '\ r \ n'de' \ n' olarak çevrildi ve linux/mac’da hiçbir şey yapmadı. [Google arama] (https://www.google.com/search?q=C%2B% 2B% 20stream% 2026) derhal "26" ve "26" ... –

+1

@MooingDuck arasında herhangi bir bağlantı bulamaz, örneğin bkz. Http://stackoverflow.com/questions/15008907/c-cin-fails-when-readin g-fazla-127-ascii değerleri –

+5

@MooingDuck - bu bir Microsoft şeydir; Bir metin dosyasındaki ctrl-Z, C kütüphanelerinde dosya sonu olarak kabul edilir. –

İlgili konular