Двоичный режим обмена с файлами. Потоковый ввод-вывод. Открытие и закрытие потока. Двоичный режим обмена с файлами. Строковый обмен с файлами. Режим форматного обмена с файлами. Позиционирование в потоке. Потоковый ввод-вывод. Библиотека языка Си поддерживает три уровня ввода-вывода: 1. Потоковый ввод-вывод 2. Ввод-вывод нижнего уровня 3. Ввод-вывод для консоли и портов При чтении из файла данные помещаются в буфер ОС, а затем порциями передаются в программу. При выводе данных в файл они накапливаются в буфере, а при заполнении буфера записываются в виде единого блока на диск. Таким образом обеспечивается буферизированный ввод-вывод, позволяющий обрабатывать данные различных размеров и форматов. Поток – это файл вместе с предоставляемыми средствами буферизации. При работе с потоком можно производить следующие действия: · Открывать и закрывать потоки; · Вводить и выводить данные; · Анализировать ошибки потокового ввода-вывода и условие достижения конца потока (конца файла); · Управлять буферизацией потока и размером буфера; · Получать и устанавливать указатель (индикатор) текущей позиции в потоке. Открытие и закрытие потока. Прежде чем начать работать с потоком, его необходимо инициализировать, т.е. открыть. При этом поток связывается в исполняемой программе с переменной предопределенного типа FILE. В структуре FILE содержаться компоненты, с помощью которых ведется работа с потоком: указатель на буфер, указатель текущей позиции в потоке и другая информация. При открытии потока в программу возвращается указатель на поток, являющийся указателем на объект структурного типа FILE. #include <stdio.h> FILE *fp ; /* объявлен указатель на поток *fp */ Указатель на поток приобретает значение в результате выполнения функции открытия потока: fp=fopen (имя файла, режим открытия) ; Например: fp=fopen (“my_text.txt”, “r”) ; При выполнении функции fopen( ) происходит выделение динамической памяти. Файл, связанный с потоком, можно открыть в одном из следующих режимов: “w” – новый текстовый файл открывается для записи. Если файл уже существовал, то предыдущее содержимое стирается, файл создается заново; “r” – существующий текстовый файл открывается только для чтения; “a” – текстовый файл открывается (или создается, если файла нет) для добавления в конец файла новой порции информации; “w+” – новый текстовый файл открывается для записи и последующих многократных исправлений. Если файл уже существует, то предыдущее содержимое стирается; “r+” – существующий текстовый файл открывается как для чтения, так и для записи в любом месте файла (однако в этом режиме невозможна запись в конец файла); “a+” – текстовый файл открывается или создается (если файла нет) и становится доступным для изменений (записи, чтения в любом месте). При этом можно открыть существующий файл, не уничтожая его содержимого; можно вести запись в конец файла, увеличивая его размеры. При открытии потока могут возникнуть следующие ошибки: указанный файл не найден (для режима чтения), диск заполнен, диск защищен от записи и т. д. В перечисленных случаях указатель на поток приобретает значение NULL. Для вывода на экран монитора сообщения об ошибке при открытии потока может использоваться библиотечная функция perror( ): if (( fp=fopen(“t.txt”,”w’))==NULL) { perror(“ошибка при открытии файла t.txt \n”); } Открытые на диске файлы после окончания работы с ними необходимо закрыть с помощью библиотечной функции: int fclose (указатель на поток) ; Открытый файл можно открыть повторно только после того, как файл будет закрыт с помощью функции fclose( ). Двоичный режим обмена с файлами. Поток можно открыть в текстовом либо двоичном (бинарном) режиме. Двоичный режим обмена с файлами организуется с помощью функций: int getc (FILE *stream) ; int putc (int c, FILE *stream) ; stream – указатель на поток; с – целочисленная переменная для приема очередного символа из файла или для записи ее значения в файл. Пример: Ввести с клавиатуры символы и записать их в файл (‘.’ – признак завершения ввода). /* ввод символов с клавиатуры и запись их в файл */ #include <stdio.h> #include <conio.h> #include <stdlib.h> int main( ) { FILE *fp; int c; char fname[20]; clrscr(); puts("Введите имя файла"); gets(fname); fp=fopen(fname, "w"); if (fp==NULL) {puts("Ошибка");exit(1);} puts("Введите символы"); while ((c=getchar())!='.') putc(c, fp); fclose(fp); fp=fopen (fname, "r"); puts ("\n Содержимое вашего файла"); while((c=getc(fp))!=EOF) putchar(c); /* вывод символов на экран */ fclose(fp); getch(); return 0; } EOF– целая константа, определенная в stdio.h, означающая конец информации в файле. |