Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






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



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

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

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

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

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

}

 


Эта страница нарушает авторские права

allrefrs.ru - 2018 год. Все права принадлежат их авторам!