Когда поток stdio встречает ошибку (но не EOF), индикатор ошибки потока будет установлен таким образом, что ferror() будет возвращать ненулевое значение. Я всегда предполагал, что в errno имеется больше информации. Но откуда я это знаю?
Документация для некоторых функций [. man fopen под Linux] говорит, что errno также будет установлен. Однако man fgets вообще не упоминает errno. Информационные страницы glibc обнадеживают:
В дополнение к установке индикатора ошибки, связанного с поток, функции, которые работают с потоками, также устанавливают `errno 'в так же, как соответствующие низкоуровневые функции, которые работают с файлом дескрипторы.
Но я не знаю, насколько сильна эта гарантия. Требуется ли это по стандарту C? Что происходит в Visual C/С++?