Файловый ввод/вывод при использовании
библиотеки stdio.h. состоит из трех основных
шагов:
открытие потока;
ввод/вывод в поток;
закрытие потока.
Открытие потока включает следующие
операции:
1. Объявление указателей на файловые
потоки:
FILE *fp1,*fp2;
2. Открытие файла и связывание его с
указателем потока с помощью функции fopen:
f1=fopen('d:\\mydir\\myfile', 'w');
Эти операции можно объединить в одну:
FILE *fp1=fopen('d:\\mydir\\myfile', 'w');
Здесь первый параметр, строка – имя
файла. Если имя файла включает имена папок, в которых он находится, то они
отделяются двойным обратным слэшем \\.
Второй параметр, строка – задает режим, в
котором открывается файл:
"г" – файл открывается для
чтения;
"w" – открывается пустой файл для записи (если файл
существует, он стирается);
"а" – файл открывается для добавления информации
в его конец;
"г+" – файл открывается для
чтения и записи (файл должен существовать);
"w+" – открывается пустой файл для чтения и записи (если файл
существует, он стирается);
"а+" – файл открывается для
чтения и добавления информации в его конец.
Режим открытия может также содержать
символы t (текстовый
режим) или b (двоичный
режим), отличающиеся обработкой символов перехода на новую строку. По умолчанию
файл открывается в текстовом режиме, при котором комбинация символов «возврат
каретки» и «перевод строки» (0x13 и 0x10) при вводе преобразуются в одиночный
символ перевода строки (при выводе выполняется обратное преобразование). В
двоичном режиме эти преобразования не выполняются.
Пример:
FILE *f =
fopen("d:\\cpp\\data", "rb+");
Открывается поток f связанный с двоичным файлом d:\\cpp\\data для чтения и записи
Проверка правильности открытия
потока
При успешном открытии потока функция
возвращает указатель f
на предопределенную структуру типа FILE, содержащую всю необходимую для работы с потоком информацию,
или NULL в противном
случае. Поэтому в программу обязательно добавляется код проверки правильности
открытия потока, чтобы не было 'зависания' компьютера:
FILE *f, *fo;
if((f = fopen("d:\\c\\file.txt", "r")) == 0)
{cout << "Ошибка открытия
входного файла"; return
1;}
В этом примере при неудачном открытии
потока произойдет завершение выполнения функции, в которой открывается поток.
Функция возвратит значение 1 с помощью оператора return 1;
Указатель f используется в дальнейших операциях с
потоком. Его передают функциям ввода/вывода в качестве параметра.
При открытии потока с ним связывается
область памяти, называемая буфером. При выводе вся информация направляется в
буфер и накапливается там до заполнения буфера или до закрытия потока. Чтение
осуществляется блоками, равными размеру буфера, и данные читаются из буфера.
Буферизация позволяет более быстро и эффективно обмениваться информацией с
внешними устройствами. Следует иметь в виду, что при аварийном завершении
программы выходной буфер может быть не выгружен, и возможна потеря данных. С
помощью функций setbuf
и setvbuf можно
управлять размерами и наличием буферов.
Существует пять предопределенных потоков,
которые открываются в начале работы программы: стандартный ввод stdin(связан с клавиатурой),
стандартный вывод stdout(связан
с дисплеем), стандартный вывод сообщений об ошибках stderr(связан с дисплеем), стандартный
дополнительный поток stdaux
и стандартная печать stdprn.
Эти указатели можно использовать в любой функции ввода/вывода там, где
требуется указатель потока.
Поток закрывается либо при завершении
программы, либо явным образом с помощью функции fclose:
fclose(указатель на поток);
Перед закрытием потока информация из
связанных с ним буферов выгружается на диск. Рекомендуется всегда явным образом
закрывать потоки, открытые для записи, чтобы избежать потери данных.
|