Введение |
Массивы, строки и структуры |
Операторы |
Операции |
Переменные и типы |
Пояснения к курсовой работе |
Препроцессор |
Стандарты безопасного кодирования |
Указатели и динамическая память |
Функции и модули |
Ввод-вывод |
Для действий с файлом сначала нужно получить указатель на поток ввода-вывода FILE*
с помощью функции fopen
. Первым аргументом указывается имя файла, вторым – режим открытия:
По окончании работы поток нужно закрыть с помощью функции 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
– тот же файл в проводнике Windowspicture.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/getcharstdout
– стандартный вывод для printf/putchar/putsstderr
– стандартный вывод для для ошибок, не буферизированныйКаждый из этих потоков можно перенаправить вместо консоли на файл.
В 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), если произошла ошибка при открытии файла.