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
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 .) –
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];' –
Điều này: 'while (! DepthStream.eof()' luôn sai –