![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Файлы прямого и последовательного доступа к данным, форматизованный и неформатизованный ввод/вывод
В С/С++ возможен последовательный и прямой доступ к данным, и форматированный и неформатированный ввод/вывод. Последовательный доступ к данным реализует посл. считывания или запись информации. Прямой доступ к данным позволяет обратиться к произвольной компоненте файла, если ее адрес может быть вычислен. Форматизованная передача данных – это передача информации, когда ее формат (поля, выделяемые под данные) определены пользователем. Неформатизованная передача данных (ввод/вывод) – это передача информации по форматам, принятым системой по умолчанию. Для организации формат. передачи данных необходимо подключить к программе функции, прототипы которых содержатся в заголовочом файле <stdio.h>. Для неформатизованного - <fstream.h> Данные при передаче рассматриваются как поток байтов, а физически поток – это файл или устройство, т.е. клавиатура или экран рассматриваются как файл. Существует 5 предопр. потоков: stdin – стандартный поток ввода (с клавы) stdout – для вывода (монитор) stderr – вывод сообщений об ошибках stdprm – вывод на принтер stdaux – дополнительный поток для передачи информации
23…Работа с файлами в С/С++, примеры. Работа с файлами (потоками) начинается с его открытия. При открытии в операционной памяти выделяется специальное место (буфер) и при выводе информация передается до полного заполнения буфера/закрытия потока. Чтение информации осуществляется блоками размером буфера. При аварийном завершении работы программы часть информации может остаться в буфере, тогда происходит потеря информации. Открыть поток для формат. передачи данных можно 1) FILE *<имя переменной>; <имя переменной> = fopen (<имя файла на диске>, <режим>); 2) FILE *<имя переменной> = fopen (<имя файла на диске>, <режим>); При успешном открытии файла создается указатель на файл, который связан с информацией, необходимой для работы с файлом. Компоненты файла нумеруются от 0 с шагом 1 и при открытии файла указатель устанавливается на компонент с номером 0. Режим параметра “r” – файл открыт для чтения, ук-тель установлен на начало файла “w” – файл открыт для записи информации в файл, указатель установлен на начало файла, если в нем была инф-ия, она стирается “a” – файл открыт для дозаписи Эти символы со знаком + устанавливают режим, позволяющий и записывать в файл, и считывать из него (двунаправленный поток). Режим открытия может содержать символ t – текстовый тип инф-ии в файле или b – двоичная бинарная инф-ия По умолчанию текстовая. Функция freopen (<имя файла на диске>, <режим>, <указатель на файл>) работает аналогично fopen, но предварительно закрывает поток, если он был ранее открыт.
Пример FILE *f1; f1 = fopen (“d:\\work\\f1.ipt”, “r”); FILE *f2 = fopen (“d:\\work\\f2.opt”, “w”);
fscanf (f1, “%d”, &x); fprintf (f2, “%8.4f”, sqrt(x));
После работы с файлом его необходимо закрыть fclose (<указатель на файл>); fcloseall();
Для просмотра всех эл-тов файла, организации цикла по файлу используется функция feof(<файловая переменная>) ftell(<файловая переменная>) – знач. указателя файла fgetpos(<файловая переменная>, <имя>) – присваивает второму параметру знач. указателя файла, соответствующего первому параметру fseek(<файловая переменная>, <смещение>, <база>) – устанавливает ук-тель файла, соотв. первому параметру в позицию, определяемую вторым и третьим параметром. <смещение> определяет, на сколько байтов необходимо сместить ук-тель файла относительно <базы>. SEEK_SET – начало файла SEEK_CUR – текущая позиция SEEK_END – конец файла fsetpos (<файловая переменная>, <pos>) – ук. в позицию, опр. вторым параметром в файле, соотв. первому параметру rewind (<файловая переменная>) – ук. в начало файла malloc (<размер>) – выделяет участок памяти заданного размера в байтах.
Если файл представляется последовательностью однотипных записей (в отличие от потока, когда файл рассматривается как текст, т.е. поток символов), для ввода и вывода используются функции fread и fwrite. Длина записи – это количество составляющих ее байтов. fread (<буфер>, <длина записи>, <кол-во>, <файл. переменная>) fwrite (<буфер>, <длина записи>, <кол-во>, <файл. переменная>)
Для ввода и вывода потока существуют следующие функции: · чтение и запись потока байтов (записей) – fread и fwrite; · чтение символа из потока – gets и fgets · чтение строки из потока – fgets · запись символа в поток – puts и fputs · запись строки в поток – fputs Формат.ввод из потока и вывод в поток реализуется функциями: fscanf fprintf Бесформатная передача данных <fstream.h> В стандартной библиотеке содержится три класса для работы с файлами. Открытие потока осуществляется конструкторами: ifstream <имя потока> (<имя файла на диске>); ofstream <имя потока> (<имя файла на диске>); fstream <имя потока> (<имя файла на диске>); Операции помещения в поток (<<) и извлечения из потока (>>). Например: 1) ifstream inputf (“file_1.txt”); inputf>>x>>y; 2) ofstream outputf (“file_2.txt”); outputf<<sqrt(x)<<(x+y); Закрытие потоков, связанных с файлами выполняется с помощью методов inputf.close (); outputf.close (); В файле f1.txt – целые числа, переписать в файл f2.txt положительные, кратные 5. # include “stdio.h” # include “conio.h” void main () { FILE *f1, *f2; f1 = fopen (“f1.txt”, “r”); f2 = fopen (“f2.txt”, “w”); int k; while (!feof(f1)) { fscanf (f1, “%d”, &k); if ((k>0) && (k%5 == 0)) { printf (“%d\t”, k); fprintf (f2, “%d\t”, k); }; } fclose (f1); fclose (f2); getch (); }
![]() |