Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
bILYeT_NOV_Ye.docx
Скачиваний:
72
Добавлен:
09.06.2015
Размер:
658.19 Кб
Скачать

22…Файлы прямого и последовательного доступа к данным, форматизованный и неформатизованный ввод/вывод.

В С/С++ возможен последовательный и прямой доступ к данным, и форматированный и неформатированный ввод/вывод.

Последовательный доступ к данным реализует посл. считывания или запись информации. Прямой доступ к данным позволяет обратиться к произвольной компоненте файла, если ее адрес может быть вычислен.

Форматизованная передача данных – это передача информации, когда ее формат (поля, выделяемые под данные) определены пользователем.

Неформатизованная передача данных (ввод/вывод) – это передача информации по форматам, принятым системой по умолчанию.

Для организации формат. передачи данных необходимо подключить к программе функции, прототипы которых содержатся в заголовочом файле <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;

  1. 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 ();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]