Файл. Открытие файла
Концепция потокового обмена
Организация ввода-вывода
Особенностью языка Си является отсутствие операторов ввода — вывода. Эти операции перенесены на верхний (программный) уровень управления и выполняются с помощью функций. Такая организация обмена обеспечивает машинную независимость и переносимость программ, т.к. связь с конкретным периферийным устройством происходит не на стадии выполнения, а на этапе компиляции за счет подключаемых библиотек, содержащих пакеты функций ввода — вывода (библиотеки, естественно, являются платформенно-зависимыми).
Исходя из концепции Unix «всё есть файл», операции обмена в Си рассматриваются как обмен потоком данных между программой и файлами, среди которых могут быть как обычные файлы — наборы данных, так и специальные файлы устройств. При работе с файлами поддерживаются различные виды буферизации, однако для программы эти действия являются «прозрачными», их выполнение обеспечиваются средствами операционной системы.
|
|
Потоки данных могут быть структурированными (streams) и низкоуровневыми, из байтов (raw). В соответствии с этим функции ввода — вывода подразделяются на высокоуровневые функции файлового обмена («стандартные») и низкоуровневые системные примитивы.
Для взаимодействия с файлами предназначена структура данных FILE. Данная структура хранит служебную информацию об открытых файлах, такую как права доступа, указатель на файловый буфер, положение курсора в файле и т.д.
Для работы с файлом его необходимо открыть, для этого предназначена функция
FILE *fopen(const char *filename, const char *mode);
filename — абсолютное или относительное имя файла, mode — режим открытия и доступа.
Режимы:
"r" — открытие существующего файла только для чтения (файл должен существовать);
"w" — создание пустого файла для записи;
"a" — открытие существующего файла для записи данных в конец файла (создание файла, если файла с заданным именем не существует);
"r+" — открытие существующего файла для чтения и записи (файл должен существовать);
"w+" — создание нового файла для чтения и записи;
"a+" — тоже, что “a”, но с возможностью чтения;
С каждым файлом связан файловый курсор, указывающий, с какой позиции файла будет совершено чтение или произведена запись. При чтении / записи данных курсор автоматически сдвигается на соответствующее количество данных.
Ввод символов или строк выполняют функции fgetc, fgets, getc, getchar, gets
#include <stdio.h>
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
char *gets(char *s);
Функция fgetc() читает следующий символ из потока stream и преобразует его из unsigned к типу int (или EOF, если достигнут конец файла)
|
|
Функция getc() эквивалентна fgetc().
Функция getchar() эквивалентна getc(stdin).
Функция gets() читает строку из потока stdin в буфер, адресуемый указателем s, строка должна заканчиваться символом '\0'. Проверка на переполнение буфера не выполняется.
Функция fgets() читает не более, чем size символов из потока stream и сохраняет их в буфере, адресуемом указателем s.
Возвращаемые значения
Функции fgetc(), getc() и getchar() возвращают прочтенный символ, преобразованный к типу int.
Функции gets() и fgets() возвращают указатель s в случае успеха и NULL в случае ошибки