Реферат: Средства ввода-вывода в Си++
Здесь имя_файла - это указатель на строку символов, представляющую собой допустимое имя файла, в которое может входить спецификация файла (включает обозначение логического устройства, путь к файлу и собственно имя файла).
Режим - определяет, каким образом файл будет открыт. Ниже в таблице показаны допустимые значения режимов.
Режим | Что обозначает данный режим |
r | Открыть текстовый файл для чтения |
w | Создать текстовый файл для записи |
a | Добавить в конец текстового файла |
wb | Создать двоичный файл для записи |
rb | Открыть двоичный файл для чтения |
ab | Добавить в конец двоичного файла |
r+ | Открыть текстовый файл для чтения/записи |
w+ | Создать текстовый файл для чтения/записи |
a+ | Добавить в конец текстового файла или создать текстовый файл для чтения/записи |
r+b | Открыть двоичный файл для чтения/записи |
w+b | Создать двоичный файл для чтения/записи |
a+b | Добавить в конец двоичного файла или создать двоичный файл для чтения/записи |
Приведем фрагмент программы, в котором используется функция fopen() для открытия файла по имени TEST.
FILE *fp;
fp = fopen("test", "w");
Следует сразу же указать на недостаточность такого кода в программе. Хотя приведенный код технически правильный, но его обычно пишут немного по-другому.
FILE *fp;
if ((fp = fopen("test", "w")==NUL)
{
printf("Ошибка при открытии файла.\n\r")"
exit(1);
}
Рис. 1
Этот метод помогает при открытии файла обнаружить любую ошибку.
Например, защиту от записи или полный диск. Причем, обнаружить еще до того, как программа попытается в этот файл что-то записать. Поэтому всегда нужно вначале получить подтверждение, что функция fopen() выполнилась успешно, и лишь затем выполнять c файлом другие операции. Ниже на рисунке 1 приведена небольшую часть программы, которая. подтверждает или не подтверждает открытие файла. Результаты работы указанной программы приведены на рисунке 2.
Рис. 2.
Потоковый ввод-вывод
На уровне потокового ввода-вывода обмен данными производится побайтно. Такой ввод-вывод возможен как для собственно устройств побайтового обмена (печатающее устройство, дисплей), так и для файлов на диске, хотя устройства внешней памяти, строго говоря, являются устройствами поблочного обмена, т.е. за одно обращение к устройству производится считывание или запись фиксированной порции данных. Чаще всего минимальной порцией данных, участвующей в обмене с внешней памятью, являются блоки в 512 байт или 1024 байта. При вводе с диска (при чтении из файла) данные помещаются в буфер операционной системы, а затем побайтно или определенными порциями передаются программе пользователя. При выводе данных в файл они накапливаются в буфере, а при заполнении буфера записываются в виде единого блока на диск за одно обращение к последнему. Буферы операционной системы реализуются в виде участков основной памяти. Поэтому пересылки между буферами ввода-вывода и выполняемой программой происходят достаточно быстро в отличие от реальных обменов с физическими устройствами.
Функции библиотеки ввода-вывода языка Си, поддерживающие обмен данными с файлами на уровне потока, позволяют обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизованный ввод и вывод. Таким образом, поток - это файл вместе с предоставляемыми средствами буферизации.
При работе с потоком можно производить следующие действия:
· открывать и закрывать потоки (связывать указатели на потоки с конкретными файлами);
· вводить и выводить: символ, строку, форматированные данные, порцию данных произвольной длины;
· анализировать ошибки потокового ввода-вывода и условие достижения конца потока (конца файла);
· управлять буферизацией потока и размером буфера;
· получать и устанавливать указатель (индикатор) текущей позиции
При открытии потока могут возникнуть следующие ошибки: указанный файл, связанный с потоком, не найден (для режима "чтение"); диск заполнен или диск защищен от записи и т.п. Необходимо также отметить, что при выполнении функции fopen() происходит выделение динамической памяти. При её отсутствии устанавливается признак ошибки "Not enough memory" (недостаточно памяти). В перечисленных случаях указатель на поток приобретает значение NULL. Заметим, что указатель на поток в любом режиме, отличном от аварийного никогда не бывает равным NULL.
Приведем типичную последовательность операторов, которая используется при открытии файла, связанного с потоком:
if ((fp = fopen("t.txt","w")) == NULL)