Существуют ли какие-либо обстоятельства, при которых функция ввода-вывода никогда не может выйти из строя?

#c #function #file #error-handling #io

Вопрос:

Большинство функций ввода-вывода ( fopen , fread , и т.д.) Могут завершиться неудачей, если система обнаружит ошибку или если переданный аргумент неверен ( fseek для некоторого значения, отличного от SEEK_SET , SEEK_CUR , или SEEK_END ), но они также могут завершиться неудачей по причинам, не зависящим от программистов. Проверка на успех утомительна и иногда может оказаться ненужной. Существуют ли какие-либо обстоятельства, при которых функция не выйдет из строя, даже если она может выйти из строя при определенных обстоятельствах? Например, fclose в файле, открытом в режиме только для чтения, и указатель на файл был недавно возвращен fopen ? Когда мне не нужно беспокоиться о сбое функции ввода-вывода? Являются ли это такими обстоятельствами?

  • Файл был открыт в режиме ЧТЕНИЯ
  • Указатель на файл был возвращен fopen и отмечен как нулевой
  • Операции чтения

Какие еще обстоятельства?

Я не понимаю, почему fclose произойдет сбой в файле, открытом в режиме ЧТЕНИЯ, потому что в файл не будут записаны никакие буферы , все, что нужно сделать, — это освободить память, и free не может произойти сбой, поэтому и не должно fclose , верно ли это предположение?

Также следует ли мне избегать rewind , потому что это не может указывать на ошибку?

Комментарии:

1. Нет. Все функции ввода-вывода могут выйти из строя. Всегда проверяйте результат. К сожалению, 80% каждой нормальной программы-это проверка ошибок и обработка исключений. Представьте, что файл удален, и соединение не удается. Вы можете остаться с открытой ручкой.

2. Значение fd было случайно перезаписано в другом месте вашей программы, но вы никогда не узнаете об этом, потому что не проверяете возврат.

3. @user16156443 Никакое количество исключающих ситуаций, о которых люди могут подумать, не может дать гарантии, потому что всегда может быть другая ситуация, о которой никто не мог подумать. У вас есть гарантия только в том случае, если она указана в соответствующей спецификации.

4. Зарегистрируйте ошибку и примите соответствующие меры.

5. Для файла, открытого для чтения, соответствующая операция закрытия вряд ли завершится неудачно. Но «очень маловероятно» не означает «гарантированно не произойдет». Я согласен с другими комментаторами. Просто всегда проверяй. Вы потратите больше времени- гораздо больше времени-пытаясь убедить себя, какие вызовы «не могут» потерпеть неудачу, и отслеживая неясные ошибки, когда, возможно, одна из них сработает, чем вы потратите просто на проверку их всех, в любом случае.