Каждому файлу в программе присваивается внутреннее логическое имя, используемое в дальнейшем при обращении к нему. Логическое имя (идентификатор файла) – это указатель на файл, т.е. на область памяти, где содержится вся необходимая информация о файле.
Формат объявления указателя на файл следующий:
FILE *ID_указателя_на_файл;
FILE – идентификатор структурного типа, описанный в стандартной библиотеке stdio.h и содержащий следующую информацию:
struct FILE {
short level;
– число оставшихся в буфере непрочитанных байт; обычный размер буфера – 512 байт; как только level = 0, в буфер из файла читается следующий блок данных;
unsigned flags;
– флаг статуса файла – чтение, запись, дополнение;
char fd;
– дескриптор файла, т.е. число, определяющее его номер;
unsigned char hold;
– непереданный символ, т.е. ungetc-символ;
short bsize;
– размер внутреннего промежуточного буфера;
unsigned char buffer;
– значение указателя для доступа внутри буфера; задает начало буфера, начало строки или текущее значение указателя внутри буфера в зависимости от режима буферизации;
unsigned char *curp;
– текущее значение указателя для доступа внутри буфера; задает текущую позицию в буфере для обмена с программой;
unsigned istemp;
– флаг временного файла;
short token;
– флаг при работе с файлом;
};
Прежде чем начать работать с файлом, т.е. получить возможность чтения или записи информации в файл, его нужно открыть для доступа.
Для этого обычно используется функция
FILE* fopen(char * ID_файла, char *режим);
Данная функция берет внешнее представление – физическое имя файла на носителе (дискета, винчестер) и ставит ему в соответствие логическое имя (программное имя – указатель файла).
Физическое имя, т.е. ID файла и путь к нему задается первым параметром – строкой, например, “a:Mas_dat.dat” – файл с именем Mas_dat и расширением dat, находящийся на дискете, “d:\\work\\Sved.txt” – файл с именем Sved и расширением txt, находящийся на винчестере в каталоге work.
Внимание. Обратный слеш «\», как специальный символ в строке записывается дважды.
При успешном открытии функция fopen возвращает указатель на файл (в дальнейшем – указатель файла). При ошибке возвращается NULL. Данная ситуация обычно возникает, когда неверно указывается путь к открываемому файлу, например, если указать путь, запрещенный для записи.
Второй параметр – строка, в которой задается режим доступа к файлу.
Возможные значения данного параметра следующие:
w – файл открывается для записи (write); если файла с заданным именем нет, то он будет создан; если же такой файл уже существует, то перед открытием прежняя информация уничтожается;
r – файл открывается для чтения (read); если такого файла нет, то возникает ошибка;
a – файл открывается для добавления (append) новой информации в конец;
r+ (w+) – файл открывается для редактирования данных, т.е. возможны и запись, и чтение информации;
a+ – то же, что и для a, только запись можно выполнять в любое место файла (доступно и чтение файла);
t – файл открывается в текстовом режиме;
b – файл открывается в двоичном режиме;
Последние два режима используются совместно с рассмотренными выше. Возможны следующие комбинации режимов доступа: “w+b”, “wb+”, “rw+”, “w+t”, “rt+”, а также некоторые другие комбинации.
По умолчанию файл открывается в текстовом режиме.
Текстовый режим отличается от двоичного тем, что при открытии файла как текстового пара символов «перевод строки» и «возврат каретки» заменяется на один символ «перевод строки» для всех функций записи данных в файл, а для всех функций вывода – наоборот – символ «перевод строки» заменяется на два символа – «перевод строки» и «возврат каретки».
Пример открытия файла:
FILE *f; – объявляется указатель на файл f;
f = fopen (" d:\\work\\Dat_sp.dat ", "w"); – открывается для записи файл с логическим именем f, имеющий физическое имя Dat_sp.dat и находящийся на диске d в каталоге work, или более кратко: