Язык Си, кроме стандартного ввода данных с клавиатуры и вывода результатов на экран, предоставляет также возможность обмена при операциях ввода/вывода с внешними устройствами, в том числе, с файлами на диске.
В Си не предусмотрены никакие предопределенные структуры файлов (такие как последовательного или прямого доступа). Все файлы рассматриваются как последовательности, потоки байтов.
Поток- это источник или приемник данных. Его можно связать с каким- либо внешним устройством, например, с принтером, клавиатурой, диском и т.д.
В языке Си определены два вида потоков: текстовый и бинарный.
Текстовый поток - это последовательность строк. Каждая строка содержит нуль и более символов и обязательно заканчивается символом – терминатором новая строка '\n'.
Бинарный или двоичный поток - это последовательность двоичных кодов (байтов), как правило, используемая для запоминания кодов машинного языка.
Поток соединяется с файлом или другим устройством посредством его открытия. Эта связь разрывается путём закрытия потока.
Открытие потока осуществляется функцией fopen(), а закрытие – функцией fclose().
Когда программа начинает работу, то автоматически открываются три потока: stdin, stdout, stderr.
STDIN –стандартный входной поток (по умолчанию связан с клавиатурой).
STDOUT – стандартный выходной поток (по умолчанию связан с экраном монитора).
STDERR – поток стандартных ошибок (связан с экраном монитора).
Для того, чтобы связать программу с файлом на диске, необходимо определить в программе переменную типа указатель на файл:
FILE *fp;
где FILE – это структура, определённая в <stdio.h> с помощью средства typedef и содержащая некоторую информацию о файле.
После того, как указатель на файл описан, его можно связать с конкретным файлом в момент открытия данного файла. Открыть файл можно с помощью следующей конструкции:
fp = fopen (“ имя_ файла”, “ режим_ доступа”);
Константы в круглых скобках имеют следующий смысл:
имя_файла – это параметр, характеризующий имя и тип используемого файла на диске, например, “test.txt”;
режим доступа – это параметр, характеризующий как должен использоваться данный файл. Этот параметр может принимать следующие значения:
’r’ -файл открывается для чтения (файл должен существовать на диске);
’w’ - файл открывается для записи; если файла с указанным именем нет, то он создаётся; если файл существует, то старое содержимое файла уничтожается;
’а’ - файл открывается, либо создаётся для дозаписи в конец файла;
’r+’ – файл открывается для чтения и записи (файл должен существовать).
’w+’ – файл открывается для чтения и записи; старое содержимое, если файл существовал, теряется.
’а+’ – файл открывается, либо создаётся для чтения уже существующей информации и добавления новой в конец файла.
Обычно по умолчанию файл считается текстовым, однако можно явно указать с каким файлом будет работать программа: текстовым (t) или бинарным (b), например:
r + t, w + b, at, wt +, и т. д.
Операцию открытия файла можно записать и так:
FILE *fp = fopen (‘test. txt’, ‘w’);
Теперь указатель fp будет связан с файлом на диске с именем ‘test.txt’. Во всех операциях с файлом теперь следует указывать fp.