Ошибка сегментации при использовании ferror () в простой программе. Зачем? - PullRequest
1 голос
/ 10 января 2010

Почему следующий код дает ошибку сегментации?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *file;
    file = fopen("text","r");
    if (file == NULL) printf("Error READING FILE");
    if (ferror(file)) printf("error reading file");    //line 9
    return 0;
}

Выполнение обратной трассировки в GDB дает: -

> #0  0x00007ffff7ad9d30 in ferror () from /lib/libc.so.6
> #1  0x00000000004005fa in main () at test.c:9

Ответы [ 3 ]

7 голосов
/ 10 января 2010

файл имеет значение NULL. Вы не видите первый printf, потому что программа падает до того, как stdout будет сброшен.

4 голосов
/ 10 января 2010

Если fopen возвращает NULL, то файл не открыт; вы передаете NULL в ferror, что недопустимо. У вас нет открытого файла для передачи; вот что означает NULL, что он не может дать вам указатель файла. ferror - для получения ошибок, связанных с чтением и записью файла, если он действительно открыт и у вас есть файл для работы.

Если fopen завершается неудачно, и вы хотите получить дополнительную информацию о причинах, вам нужно проверить глобальную переменную errno , определенную в errno.h.

#include <errno.h>

// ...snip...

if (file == NULL) 
  printf("Error READING FILE: %s\n", strerror(errno));

В этом примере показано, как извлечь строку, описывающую ошибку; Вы также можете сравнить значение в errno с одним из возможных значений и сделать что-то другое в зависимости от ошибки. См. fopen справочную страницу или POSIX spec , для списка возможных ошибок для сравнения. Вот как вы можете проверить различные возможные ошибки:

if (file == NULL) {
  int error = errno;  // copy it so other calls like printf don't modify it
  printf("Error READING FILE: %s\n", strerror(error));
  switch (error) {
  case EACCESS:
    // access was denied
    break;
  case ENOENT:
    // the file or one of its ancestors doesn't exist
    break;
    // etc...
  }
}

(это расширение того, что я первоначально написал в комментарии к другому ответу)

3 голосов
/ 10 января 2010

Если файл равен NULL в строке 9, то ошибка сегмента будет возникать во время вызова ferror().

Если файл имеет значение NULL (как определено в строке 8), вам не следует выполнять строку 9.

Ваш код строки 8 должен быть изменен следующим образом:

if (file == NULL)
{
    printf("Error READING FILE");
    return 1;
}

NB: я могу быть очень неправ в этом, прошло много времени с тех пор, как я сделал C / C ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...