Фред и феррор не установлены

Я пытаюсь проверить когда fread() выдает ошибку, поэтому я использую ferror(),

chunk = fread(buf, 1, 100, file);
if (ferror(file))
  {
    return errno;
  }

Но, ferror() Страница man говорит:

ОШИБКИ Эти функции не должны выходить из строя и не устанавливать внешнюю переменную errno.

Итак, как я могу узнать тип ошибки произошел, когда файл был прочитан, хотя fread() а также ferror() не установлен errno?

2 ответа

Решение

Вы не можете добраться отсюда.

fread не устанавливает errno (как вы обнаружили), и, как таковой, вы не можете определить многое о конкретном состоянии ошибки; только что есть один. Точная природа ошибки обычно зависит от реализации. Не существует портативного способа собрать его на основе стандартных библиотек C.

Что касается конкретных ошибок системного уровня, вы можете отнести их к системным вызовам, возможно, страдая от ловушек, таких как плохая / несуществующая буферизация ввода-вывода. Там POSIX может несколько прийти вам на помощь. Звонки как read, сделать набор errno и иметь довольно подробный набор возможных результатов. Это может быть вариантом для вас, если платформа, с которой вы работаете, совместима с POSIX, и код действительно настолько важен, чтобы быть в курсе событий.

Но из стандартной библиотеки C вы не найдете ничего, кроме того, что вам сообщили, что произошла ошибка. Как правило, вы обнаружите, что вам не нужно больше, в любом случае.

Эти функции не используют errnoтак что ты тоже не должен.

Стоит отметить, что вы можете сказать, все ли прошло гладко из возвращаемого значения fread(), Если возвращаемое значение fread() отличается от пройденного nmemb параметр (100 в вашем случае), то вы либо достигли конца вашего файла, либо произошла ошибка при его чтении ( источник). Так что тестируйте только в этом случае:

Просто откажитесь от использования errno:

chunk = fread(buf, 1, 100, file);
if (chunk != 100) { // If fread() returns a number different to the nmemb parameter, either error or EOF occured
    if (ferror(file))
      {
        printf("Error occured while reading file.");
        return -1; // Or what ever return value you use to indicate an error
      }
}
Другие вопросы по тегам