Почему fread() останавливается на строке из 0?

Я пытаюсь прочитать двоичный файл со следующей двоичной конфигурацией

00 00 00 1A 79 20 83 DB 44 ...

используя следующую функцию

static BitArray getBitArray(string filename)
{
    FILE *fs = fopen(filename.data(),"r");
    fseek (fs , 0 , SEEK_END);
    unsigned long s = ftell (fs);
    rewind (fs);

    unsigned char *buffer = new unsigned char[s+1];

    fread(buffer,1,s,fs);

    BitArray bArray;
    for(int i=0; i<s; i++)
        bArray.add(buffer[i]);

    delete[] buffer;
    fclose(fs);
    return bArray;
}

где BitArray - это просто мой собственный класс управления битами. Проблема в том, что для bin-файла, о котором я упоминал выше, он читает только первые три 0, например:

00 00 00

хотя fseek нашел правильный размер файла.

Что касается того, почему мне нужна эта строка 0, так это потому, что 00 00 00 1A образует 32-битное целое число, которое оказалось достаточно маленьким, чтобы оставить три 0x00.

Я подозревал, что строка 0x00s в начале файла распознается как EOF, поэтому я попытался добавить char перед файлом, но это не совсем сработало.

Что может быть причиной этого?


person Kang Min Yoo    schedule 17.05.2012    source источник
comment
Каково возвращаемое значение fread?   -  person Jay    schedule 17.05.2012


Ответы (1)


в Windows 0x1A, также известный как ^Z, является символом конца файла. Вы открыли файл в текстовом, а не в двоичном режиме. Когда вы открываете файл в текстовом режиме в Windows, он будет читаться до конца файла или до первого символа ^Z.

передайте "rb" в fopen вместо "r", чтобы открыть файл в двоичном режиме.

person Michael Slade    schedule 17.05.2012