Я сталкиваюсь со странной ситуацией. Я использую Dev C ++ для написания следующей программы:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
FILE *fp; // edited -- wrong type at first (File)
unsigned char a, b;
int c, count, res; // added "res"short int d;
fp = fopen("record.dat", "r");
fseek(fp, SEEK_SET, 0);
count = 0; // edited -- wrong variable name at first
res = fread(&a, 1, 1, fp);
printf("a res = %d, errno %d\n", res, errno);
while(count < 10) {
count++;
res = fread(&b, 1, 1, fp); // added "res =" as mentioned in comment
printf("b res = %d, errno %d\n", res, errno);
res = fread(&c, 4, 1, fp); // added "res =" as mentioned in
printf("c res = %d, errno %d\n", res, errno);
res = fread(&d, 2, 1, fp); // added "res =" as mentioned in
printf("d res = %d, errno %d\n", res, errno);
res = fread(&a, 1, 1, fp); // ** where problem starts
printf("a res = %d, errno %d\n", res, errno);
}
fclose(fp);
}
Файл «record.dat» имеет размер более 1 МБ, поэтому я полагаю, что вышеуказанная программа может получить данные первых 10 записей без каких-либо проблем (например, не нужно обрабатывать EOF
выпуск). Однако, когда я компилирую программу в Dev C ++ и запускаю ее, прочитав 4 записи, fread()
(отмечено ** выше) возвращает 0, а затем последующие fread()
внутри цикла while также возвращается 0, что означает, что данные не могут быть прочитаны. Чужая вещь это все errno
равны 0, и когда я использую компилятор g ++ в Linux для компиляции той же программы, программа может без проблем прочитать все (не только 10) записей в одном файле.
Я что-то пропустил? Спасибо!
Если вы читаете бинарный файл, вы должны открыть его с помощью "rb"
не "r"
, В противном случае вы получаете (в зависимости от платформы) обработку в «текстовом режиме». В Linux это ничего не меняет, но в Windows это переводит CR / LF (0D 0A
) чтобы '\n'
и может также интерпретировать ^Z
как конец файла.
Вы можете убедиться в этом, посмотрев на шестнадцатеричный дамп файла: если ваша программа загадочно перестает читать 1A
, это проблема.