Вопрос по fread, ifstream, c++ – ifstream.eof () - конец файла достигнут до реального конца

7

У меня есть примерно 11.1G бинарный файл, где хранится серия кадров глубины из Kinect. В этом файле 19437 кадров. Чтобы прочитать один кадр за раз, я используюifstream вfstream но это достигаетВФ до реального конца файла. (Я получил только первые 20 кадров, и функция останавливается из-заВФ флаг)

Тем не менее, все кадры могут быть прочитаны с помощьюFread вSTDIO вместо.

Кто-нибудь может объяснить эту ситуацию? Спасибо за драгоценное время на мой вопрос.

Вот мои две функции:

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

Еще раз спасибо за драгоценное время на мой вопрос

вы открываете поток C в двоичном режиме, почему неВы открываете поток C ++ в двоичном режиме?ifstream depthStream("fileName.dat", std::ios_base::bin);  (Кроме того, удаление и повторный запрос вашего буфера на каждой итерации кажется немного глупымне так ли? И использоватьstd::vector для буфера.) Mooing Duck
Также см:stackoverflow.com/questions/5605125/..., Кроме того, вы, вероятно, хотите использовать что-то вродеstd::vector buffer(size); вместоbuffer = new char[size]; Jerry Coffin
Это:while(!depthStream.eof() всегда неправильно Другие условия могут привести к сбою чтения, кроме конца файла. Ed S.

Ваш Ответ

1   ответ
15

Вам нужно открыть поток в двоичном режиме, иначе он остановится на первом байте, который видит со значением 26.

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

Что касается того, почему 26 является особенным, это 's код для Ctrl-Z, который был соглашением, используемым, чтобы отметить конец текстового файла. История этого была записана вРаймонд Ченс блогом.

Просто потратил 2 дня, пытаясь выяснить, что, черт возьми, здесь происходит ... Спасибо, переполнение стека! MathematicalOrchid
подождите, остановитесь на первом байте с 26? Я'никогда не слышал о такой вещи. Я думал, что текстовый режим просто переведен\r\n в\n на окнах, и ничего не сделал на Linux / Mac.мой поиск в Google Безразлично»немедленно найти любую связь между потоками и26"... Mooing Duck
@MooingDuck - это вещь Microsoft; Ctrl-Z в текстовом файле рассматривается как конец файла в их C-библиотеке. Pete Becker
@MooingDuck, см. Напримерstackoverflow.com/questions/15008907/... Mark Ransom
Проголосовал, потому что яя застрял в этой проблеме в течение последних 3 часов. Никогда не слышал о 26 таких особенных. Узнал что-то очень интересное сегодня Alex

Похожие вопросы