printРабота с файлами

printОткрытие и закрытие файлов, перенаправление ввода и вывода

Для действий с файлом сначала нужно получить указатель на поток ввода-вывода FILE* с помощью функции fopen. Первым аргументом указывается имя файла, вторым – режим открытия:

  • "r" открыть существующий файл для чтения;
  • "w" создать новый файл для записи;
  • "wx" создать новый файл для записи, если файл существует, то ошибка;
  • "a" открыть существующий файл для добавления в конец файла.

По окончании работы поток нужно закрыть с помощью функции fclose.

FILE* in=fopen("input.txt","r");
FILE* out=fopen("output.txt","w");
...
fclose(in);
fclose(out);

Полное имя файла состоит из пути к папке, содержащей файл, и имени файла, которое может включать расширение (часть имени после точки). Расширение файла не определяет формат содержания файла, а подсказывает пользователю или ОС, с помощью какой программы можно просмотреть или отредактировать данный файл.

Имена папок в пути разделяются в Unix/Linux с помощью /, в Windows \ (который нужно удваивать в строках C!). Для переноса программ между ОС в функциях C/C++ можно всегда писать /. В обоих семействах ОС имя . является обозначением для текущей папки, .. – для родительской папки. В Unix/Linux корневая папка обозначается /, в Windows дополнительно перед \ указывается имя устройства (C:) или имя сервера (\\SERVER). Если полное имя файла начинается не с корневой папки (абсолютный путь), то поиск файла выполняется от текущей (рабочей) папки (относительный путь).

C:/Users/petrov/Downloads/picture.jpg – абсолютный путь
C:\Users\petrov\Downloads\picture.jpg – тот же файл в проводнике Windows
picture.jpg – тот же файл, если текущая папка C:\Users\petrov\Downloads
./picture.jpg – относительный путь для той же текущей папки
Downloads/picture.jpg – относительный путь, если текущая папка C:\Users\petrov
..\..\petrov\Downloads\picture.jpg – относительный путь, если текущая папка C:\Users\ivanov\Documents

В Windows регистр букв в имени файлов не важен, но в Unix/Linux является существенным, поэтому в программах нужно писать имена файлов, учитывая регистр, а в Linux не давать файлам имена, отличающиеся только регистром. Также рекомендуется использовать относительные пути, чтобы пользователь мог размещать программу в любой папке, и использовать / для разделения имен папок.

Имена NUL, AUX, CON, PRN, LPT1, …, LPT9, COM1, …, COM9 для файлов в Windows без указания пути и расширения зарезервированы для работы с устройствами. Например, CON – это консоль (аналог /dev/tty в Linux), NUL – никуда не выводить или пустой файл при вводе (аналог /dev/null).


Несколько потоков уже открыты при запуске программы и связаны с консолью:

  • stdin – стандартный ввод для scanf/getchar
  • stdout – стандартный вывод для printf/putchar/puts
  • stderr – стандартный вывод для для ошибок, не буферизированный

Каждый из этих потоков можно перенаправить вместо консоли на файл. В MinIDE это можно сделать через меню Вид-Параметры, указав в первой строке
<input.txt >output.txt 2>error.txt
<имя используется для перенаправления ввода stdin с консоли на ввод из файла имя
>имя – для перенаправления stdout вывода с консоли на файл имя
2>имя – для перенаправления stderr вывода с консоли на файл имя

Если вместо >имя указать >>имя, то вывод будет добавляться к содержимому файла.

Альтернативный вариант – можно ввести в окне консоли справа команду для запуска программы:
имяпрограммы <input.txt >output.txt 2>error.txt

Можно не указывать перенаправление для некоторых потоков, тогда они останутся связанными с консолью. Для отладки программы удобно перенаправлять только ввод:
имяпрограммы <input.txt

Стандартные потоки можно перенаправить внутри программы с помощью функции freopen:
freopen("input.txt","r",stdin);
Функция возвращает 0 (nullptr), если произошла ошибка при открытии файла.

loading