Вопрос

Я пишу библиотеку C, которая читает файл в память. Он пропускает первые 54 байта файла (заголовка), а затем считывает остаток как данные. Я использую fseek, чтобы определить длину файла, а затем использую fread для чтения в файле.

Цикл запускается один раз, а затем заканчивается, потому что достигнут EOF (без ошибок). В конце bytesRead = 10624, ftell (stream) = 28726, и буфер содержит 28726 значений. Я ожидаю, что fread будет читать 30000 байт, а позиция файла будет 30054, когда достигнут EOF.

C не мой родной язык, поэтому я подозреваю, что где-то произошла глупая ошибка новичка.

Код выглядит следующим образом:

const size_t headerLen = 54;

FILE * stream;
errno_t ferrno = fopen_s( &stream, filename.c_str(), "r" );
if(ferrno!=0) {
  return -1;
}

fseek( stream, 0L, SEEK_END );
size_t bytesTotal = (size_t)(ftell( stream )) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
    size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
    bytesRead+=result;
}
<Ч>

В зависимости от используемой вами ссылки вполне очевидно, что добавление тега & bot; на флаг режима есть ответ. Поиск кандидатур на нагрудный знак. : -)

Эта ссылка говорит об этом во втором абзаце, втором предложении (хотя и не в их таблице).

MSDN не обсуждает двоичный файл флаг до половины страницы.

OpenGroup упоминает о существовании " b " тег, но утверждает, что он "не должен иметь никакого эффекта".

Это было полезно?

Решение

возможно, это проблема двоичного режима. Попробуйте открыть файл с " r + b " в качестве режима.

РЕДАКТИРОВАТЬ : как отмечено в комментарии " rb " , вероятно, лучше соответствует вашему первоначальному намерению, поскольку " r + b " откроет его для чтения / записи, а " rb " доступен только для чтения.

Другие советы

Также стоит отметить, что простое включение binmode.obj в вашу команду ссылки сделает это за вас при открытии всех файлов.

Решение, основанное на предыдущих ответах:

    size_t bytesRead = 0;
    BYTE* localBuffer = new BYTE[bytesTotal];
    fseek(stream,headerLen,SEEK_SET);
        while(!feof(stream) && !ferror(stream)) {
        size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-
        bytesRead,stream);
    bytesRead+=result;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top