Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / Лекции по ЯП (часть 3).doc
Скачиваний:
140
Добавлен:
15.04.2015
Размер:
1.34 Mб
Скачать

Работа с файлами Связь между потоками и файлами

Все операции ввода-вывода, в том числе из файлов и в файлы, выполняются с помощью потоков. Потоки для работы с файлами устроены и работают точно так же. Основное отличие работы с потоками дисковых файлов от стандартных потоков состоит в том, что такой поток необходимо создать в программе явным образом и ассоциировать его с конкретным файлом на диске.

Типы дисковых файлов

Ранее говорилось, что в С имеется два типа потоков: текстовые и двоичные. Поток любого из этих типов можно ассоциировать с файлом, но при этом важно понимать разницу между ними, чтобы корректно ими пользоваться.

Текстовые потоки ассоциируются с текстовыми файлами. Текстовый файл состоит из последовательности строк. Каждая строка содержит нулевое или ненулевое количество символов и заканчивается одним или несколькими символами, обозначающими конец строки. Важно помнить, что строка в текстовом файле — это не то же самое, что символьная программе на Си, потому что в ней нет завершающего нулевого символа (\0). При работе с текстовым потоком выполняется автоматическое взаимное преобразование символа конца строки Си (\n) и символа (или символов), который используется операционной системой для обозначения концов строк в файлах.

Двоичные потоки ассоциируются с двоичными файлами. Все данные считываются и записываются в неизменном виде, без разделения на строки и символов конца строки. Нулевой символ (\0) и символ конца строки (\n) не имеют никакого особого смыслового значения и воспринимаются как любой другой байт данных.

Некоторые функции ввода-вывода могут работать только в одном из двух режимов, другие — в обоих.

Открытие файла

Для открытия файла используется библиотечная функция fopen().

Прототип fopen() находится в файле stdio.h и выглядит следующим образом:

FILE *fopen(const char *filename, const char *mode);

Для каждого открываемого файла необходимо объявить указатель на структуру FILE. При вызове функции fopen() она создает экземпляр структуры FILE и возвращает указатель на нее. Этот указатель затем используется в последующих операциях с файлом. Если функция fopen() не смогла открыть файл, она возвращает нулевой указатель NULL. Это может произойти из-за какого-либо сбоя в устройствах ввода-вывода или, например, при попытке открыть файл на неформатированном диске.

Аргумент mode указывает режим открытия файла: является ли он текстовым или двоичным, открывается ли файл для чтения, записи или обеих этих операций. Возможные значения аргумента mode перечислены в следующей таблице.

Режим

Значение

r

Открытие файла для чтения. Если файл не существует, функция fopen() возвращает NULL

w

Открытие файла для записи. Если файл не существует, он создается. Если существует, он удаляется без предупреждения, а взамен создается новый пустой

a

Открытие файла для добавления данных в конец. Если файл не существует, он создается. Если файл существует, новые данные дописываются в его конец.

r+

Открытие файла для чтения и записи. Если файл не существует, он создается. Если существует, новые данные записываются с его начала, затирая уже имеющую информацию

w+

Открытие файла для чтения и записи. Если файл не существует, он создается. Если файл существует, он очищается, и новые данные записываются в очищенный файл.

a+

Открытие файла для чтения и добавления данных. Если файл не существует, он создается. Если файл существует, новые данные дописываются в его конец.

По умолчанию файл открывается для работы в текстовом режиме. Чтобы открыть его в двоичном режиме, к аргументу mode следует добавить букву b. Таким образом, если аргумент mode равен a, то файл открывается для добавления данных в текстовом режиме, а если ab — то в двоичном.