Поток позволяет ассоциировать файл с буфером, который позволяет осуществить эффективный ввод - вывод. Буфер – это выделенный участок памяти. При буферном вводе информация с носителя информации (из файла) вначале поступает в буфер, а затем оттуда передается прикладной программе. Аналогично и при буферном выводе – информация из программы вначале поступает в буфер, а затем – на носитель информации (в файл).
Если для ввода и вывода в программе используются потоки, то для программиста буферизация выполняется автоматически.
В С (С++) различают два вида файлов : текстовые и двоичные (бинарные).
Текстовые файлы состоят из строк символов и предназначены для чтения человеком. На диске текстовые файлы хранятся в виде сплошной последовательности символов, и их деление на строки становится заметным лишь в момент вывода на экран или на печать, так как именно при выводе управляющие символы (например, \n) начинают выполнять свои функции.
Бинарный файл – это последовательность байтов, однозначно соответствующая последовательности байтов, записанной на внешнем устройстве.
Основными действиями, производимыми над файлами, являются их открытие, обработка и закрытие.
В языке С указатель на поток является указателем на тип с именем FILE.
Тип FILE определяется в заголовочном файле stdio.h и представляет собой структуру, описывающую параметры реализации потока, такие, например, как адрес буфера, с которым будет работать файл, адрес текущего символа, который будет передаваться (приниматься) в прикладную программу, и т. д..
При открытии файлов порция информации из дискового файла поступает в буфер и указатель на поток получает адрес буфера.
В языке С файлы открываю с помощью функции fopen(). Функция fopen() имеет два параметра. Первый параметра является строковой константой, которая задает имя файла и путь к нему. Второй параметр – тоже строковая константа – задает режим доступа к файлу. Режим доступа описывает две составляющие: способ доступа (чтение или запись) и тип файла (текстовый или двоичный).
Для работы с текстовым файлом можно к режиму доступа добавить строчную латинскую букву t, но делать это не обязательно, так как файлы открываются в текстовом виде по умолчанию.
Для работы с бинарными файлами обязательно нужно к режиму доступа добавить строчную латинскую букву b.
Файлы (С )
Варианты открытия файла:
Вариант 1: #include <stdio.h>
FILE *f;
f = fopen("D:\\text.txt", "r");
{ // обработка файла
}
Вариант 2: #include <stdio.h>
FILE *f;
if((f = fopen("D:\\text.txt", "r"))!=NULL)
{ // обработка файла
}
Прототип функции fclose():
int fclose(FILE * f)
Файлы (С )
Таким образом, чтобы открыть файл (например, текстовый файл) для чтения, нужно произвести следующие действия :
Объявить указатель на поток;
Открыть файл функцией fopen() (т.е. связать указатель на поток с дисковым файлом и указать режим доступа r).
При попытке открыть существующий файл можно допустить ошибку в его имени или в указании пути к нужному файлу. Это вызывает ошибку выполнения программы. Следует предвидеть подобные ситуации и проводить проверку возможности открытия файла. Такую проверку осуществить довольно легко, так как функция fopen() возвращает значение указателя на поток в случае его успешного открытия и значение NULL (нулевой указатель), если доступ к файлу невозможен .
Файлы, открываемые в режиме записи, также нуждаются в аналогичной проверке.
Функция fclose() закрывает поток, открытый ранее функцией fopen(). Она записывает все оставшиеся в буфере данные в файл и закрывает его, используя команды операционной системы. Ошибка, возникшая при закрытии файла, может породить множество проблем, начиная с потери данных и разрушения файлов и заканчивая непредсказуемыми последствиями для программы. Кроме того, функция fclose() освобождает управляющий блок файла, связанного с потоком, позволяя использовать этот блок повторно.
Операционная система ограничивает количество одновременно открытых файлов, поэтому, прежде чем открыть один файл, следует закрыть другой.
Параметр f представляет собой указатель файла, возвращенный функцией