Для работы с данными на диске вам нужен дескриптор. В C таким дескриптором является указатель, возвращаемый функцией fopen. Вы указываете режим, получаете указатель и используете его для потоковой передачи данных внутрь файла или из него. Наиболее распространенные режимы: r для чтения, w для записи и a для добавления. Если выбрать их неправильно, можно потерять данные или вызвать сбой программы.
Рассмотрим простую задачу: запись чисел от 1 до 10 в файл.
Этот код открывает файл с именем out в режиме w. Это режим записи с перезаписью (разрушающая запись). Если файл out не существует, система создает его. Если он уже существует, его старое содержимое полностью стирается и заменяется новым. Переменная f хранит указатель на файл. Этот указатель используется для всех последующих операций. Если открыть файл не удается (из-за проблем с правами доступа, переполнения диска или несуществующего пути), f принимает значение NULL.
Функция вывода здесь — fprintf. Она работает точно так же, как printf, но первым аргументом ей передается указатель на файл. Как только работа завершена, fclose освобождает ресурс.
Обработка ошибок при работе с файлами в функции main
Этот фрагмент кода является первым в серии примеров, возвращающим код ошибки из функции main. Когда fopen завершается неудачей, f содержит нулевое значение. В C ноль интерпретируется как ложь (false). Все остальные значения интерпретируются как истина (true). Оператор ! инвертирует эту булеву логику.
Конструкция if (!f) проверяет, является ли указатель нулевым. Это эквивалентно if (f == 0), но первый вариант является стандартной идиомой. Если условие истинно, программа возвращает код 1.
В системах UNIX вы можете проверить этот код выхода непосредственно из командной строки. Он сообщает, успешно ли выполнился скрипт или программа, или же столкнулась с ошибкой. Умение вовремя перехватывать такие ошибки экономит часы отладки в будущем.
Зачем вообще заморачиваться с кодами возврата, если можно просто вызвать аварийное завершение (crash)? Потому что контролируемое завершение лучше, чем неопределенное поведение. Вы можете записать ошибку в журнал, уведомить пользователя или попытаться выполнить операцию повторно. Позволять программе тихо падать — это ленивая инженерия.
Прелесть этого подхода заключается в его простоте. Открываете. Проверяете. Записываете. Закрываете. Никакой магии. Никакого скрытого состояния. Просто указатель и файл.
А что, если вам нужно прочитать то, что вы только что записали? Или добавить данные в существующий журнал, не уничтожая историю? Строка режима меняет всё. r оставляет файл без изменений. a добавляет данные в конец. w стирает всё содержимое. Выбирайте внимательно.

















