2013-02-22 27 views
7

Tôi có một tệp nhị phân khoảng 11.1G, nơi lưu trữ một loạt các khung chiều sâu từ Kinect. Có 19437 khung trong tệp này. Để đọc một khung hình mỗi thời gian, tôi sử dụng ifstream trong fstream nhưng nó đạt eof trước khi kết thúc thực sự của tập tin. (Tôi chỉ có 20 khung hình đầu tiên, và các chức năng dừng vì eof cờ)ifstream.eof() - kết thúc tệp được truy cập trước khi kết thúc thực sự

Tuy nhiên, tất cả các khung có thể được đọc bằng cách sử dụng fread trong stdio để thay thế.

Có ai có thể giải thích tình huống này không? Cảm ơn bạn đã dành thời gian quý báu cho câu hỏi của tôi.

Dưới đây là hai chức năng của tôi:

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

Một lần nữa, cảm ơn bạn đã dành thời gian quý báu về câu hỏi của tôi

+2

bạn mở luồng C ở chế độ nhị phân, tại sao bạn không mở luồng C++ ở chế độ nhị phân? 'ifstream depthStream (" fileName.dat ", std :: ios_base :: bin);' (Ngoài ra, xóa và thu hồi bộ đệm của bạn mỗi lần lặp lại có vẻ hơi ngớ ngẩn một chút không? Và sử dụng 'std :: vector' cho bộ đệm .) –

+0

Xem thêm: http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong. Ngoài ra, bạn có thể muốn sử dụng một cái gì đó như 'std :: vector buffer (size);' thay vì 'buffer = new char [size];' –

+0

Điều này: 'while (! DepthStream.eof()' luôn sai –

Trả lời

13

Bạn cần phải mở dòng trong chế độ nhị phân, nếu không nó sẽ dừng lại ở byte đầu tiên nó thấy với giá trị là 26.

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

Vì lý do tại sao 26 là đặc biệt, đó là mã dành cho Ctrl-Z được sử dụng để đánh dấu phần cuối của tệp văn bản. Lịch sử đằng sau này được ghi lại trong Raymond Chen's blog.

+0

chờ đợi, dừng lại ở byte đầu tiên với một 26? Tôi chưa bao giờ nghe nói về một điều như vậy. chế độ văn bản chỉ dịch '\ r \ n' thành' \ n' trên cửa sổ và không làm gì trên linux/mac. [tìm kiếm Google của tôi] (https://www.google.com/search?q=C%2B% 2B% 20stream% 2026) không tìm thấy bất kỳ kết nối nào giữa các luồng và "26" ... –

+1

@MooingDuck, xem ví dụ http://stackoverflow.com/questions/15008907/c-cin-fails-when-readin g-more-than-127-ascii-values ​​ –

+5

@MooingDuck - đây là một điều Microsoft; ctrl-Z trong một tập tin văn bản được coi là kết thúc của tập tin trong thư viện C của họ. –

Các vấn đề liên quan