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