c fscanf проверка ошибок - PullRequest
       45

c fscanf проверка ошибок

2 голосов
/ 26 апреля 2011

Я использую fscanf для чтения из файла в C. Мне просто интересно, правильно ли я проверяю все условия ошибок, и это самый надежный способ сделать это, и я ничего не пропускаю.

FILE* fp;
char filename[] = "untitled";
int count;

char item1[1025];
char item2[1025];


fp = fopen(filename, "r");
if (fp == NULL) {
    perror("fopen");
    return -1;
}

count = fscanf(fp, "%1024s%1024s", item1, item2);
if (count == EOF) {
    if (ferror(fp)) {
        perror("fscanf");
    }
    else {
        fprintf(stderr, "Error: fscanf matching failure\n");
    }
    return -1;
}
else if (count == 0) {
    fprintf(stderr, "Error: fscanf early matching failure\n");
    return -1;
}
else if (count != 2) {
    fprintf(stderr, "Error: fscanf matched less items than expected\n");
    return -1;
}

if (fclose(fp) == EOF) {
    perror("fclose");
    return -1;
}

Спасибо за ваше время.

РЕДАКТИРОВАТЬ после комментариев:

count = fscanf(fp, "%1024s%1024s", item1, item2);
if (count == EOF) {
    if (ferror(fp)) {
        perror("fscanf");
    }
    else {
        fprintf(stderr, "Error: fscanf reached end of file, no matching characters, no matching failure\n");
    }
    return -1;
}
else if (count != 2) {
    fprintf(stderr, "Error: fscanf successfully matched and assigned %i input items, 2 expected\n", count);
    return -1;
}

Ответы [ 3 ]

2 голосов
/ 26 апреля 2011

scanf не возвращает EOF при "сбое сопоставления".Он возвращает EOF только при «сбое ввода» (EOF, ошибках чтения или ошибках кодирования) и только в случае сбоя ввода перед любым успешным преобразованием и назначением.Поэтому, если возвращаемое значение равно EOF, либо ferror, либо feof должны возвращать ненулевое значение.

1 голос
/ 26 апреля 2011
else if (count == 0) {
    fprintf(stderr, "Error: fscanf early matching failure\n");
    return -1;
}
else if (count != 2) {
    fprintf(stderr, "Error: fscanf matched less items than expected\n");
    return -1;
}

не выдерживает испытания юзабилити.Эти случаи не различимы по сообщению об ошибке;если вы должны сообщить обоим опциям пользователю, то почему бы не

if (count != NMATCHES)
    fprintf(stderr, "Error: wanted %d items, found %d\n", NMATCHES, count);
0 голосов
/ 26 апреля 2011
  1. Ваш fscanf работает только тогда, когда вы используете fprintf с теми же% 1024s% 1024s, в противном случае я не думаю, что вы можете получить строки в двух переменных char.

  2. Вы ограничиваете свой код размером 1 КБ, вы никогда не должны использовать жесткое кодирование значений, и что вы будете делать, если размер строки превышает 1 КБ (крайний случай), поэтому вы должны ограничить размер строки вразмер файла не превышает 1 КБ, чего нельзя ожидать каждый раз, если вы не можете записать данные в один и тот же файл.

...