
Лабораторная работа № 6.
ВВОД / ВЫВОД ИНФОРМАЦИИ СРЕДСТВАМИ C++. ФАЙЛЫ.
Цель работы:
Изучить особенности работы с текстовыми и бинарными файлами.
2. Подготовка к работе.
Изучить основные методы обработки текстовых файлов . Необходимо знать , как осуществляется последовательный доступ к элементам двоичных файлов [лекция 14, 16.]
3. Теоретическая часть.
3.1. Библиотечные функции.
Библиотечные функции для работы с файлами делятся на потоковые и префиксные. Их существенное отличие состоит в том, что потоковые функции выполняют дополнительную буферизацию (на уровне библиотечной функции и на уровне MS DOS), а префиксные сразу обращаются к функциям MS DOS. Таким образом, префиксные функции являются блоко - ориентированными , а их использование приносит выигрыш при переносе целой группы файлов (кратной размеру сектора диска 512 байт). Потоковые функции приносят выигрыш при работе с символьными и строковыми данными.
3.2. Режимы доступа к файлам.
Вне зависимости от типа библиотечных функций существует два различных режимов доступа к файлам: текстовый и двоичный.
В текстовом режиме производится трансляция символов CR LF (0Dh 0Ah) - перевод строки. При чтении пара символов CR LF преобразуется в «\n», а при записи производится обратное преобразование. Кроме этого символ Ctrl-Z (ASCII 1Ah), считается, что достигнут конец файла (EOF).
В двоичном режиме все символы рассматриваются как не имеющие определённого смысла, и никакого преобразования не производится.
Режим доступа к файлу задаётся двумя способами: при открытии файла путём задания соответствующей опции или заданием значения предопределённой (описанной в <stdlib.h>) переменной _fmode. Переменная _fmode может принимать два значения
O_BINARI (для двоичного режима) и O_TEXT (для текстового режима). Например:
_fmode= O_BINARI;
_fmode= O_TEXT;
По умолчанию режим доступа определён как O_TEXT.
3.3. Потоковый ввод/вывод информации средствами Turbo C++.
При организации потокового ввода/вывода информации используется предопределённый тип FILE (типа структура), описанный в заголовочном файле <stdio.h>.
Открытие файла выполняется с помощью функции fopen
FILE _FAR *_Cdecl _FARFUNC fopen(const char _FAR *__path, const char _FAR *__mode);
Вывод информации на экран дисплея
Функция puts() - аргументом функции может быть:
- строковый литерал puts("данная информация отобразится на экране дисплея");
- строковая переменная или константа.
Например:
#define G "хорошо"
char g[]="хорошо "
puts(g); puts(G); //на экране дисплея отобразится дважды слово
// "хорошо"(функция переводит курсор автоматически)
"хорошо"
"хорошо"
Функция putchar() - предназначена для вывода единичного символа . Аргументом функции может быть:
#define GO 'f'
char g='f'
puts('f'); // символьный литерал
puts(g); // символьная переменная
puts(GO); // символьная константа
Функция printf() - для вывода числовых данных
Ввод данных
Функция gets() - функция вводит строку в переменную
Для организации ввода/вывода посредством файлов необходимо организовать связь логического файла с физическим .
FILE *fopen(const char *filename, const char *mode);
Функция возвращает указатель на переменную типа FILE, описывающий открытый поток файлового ввода -вывода. Если невозможно открыть (создать) файл, функция возвращает null- указатель. Переменная filename- указатель на ASCIIZ - строку символов, задающую спецификацию открытого (создаваемого) файла. Например:
"c:\\tc\\rabcat\\myfile.dat"
Если не специфицируется буква накопителя, используется накопитель по умолчанию, определённый
Переменная mode - указатель на ASCIIZ - строку символов, задающую режим открытия файла
mode |
режим открытия файла |
r |
Файл открывается для чтения. При успешном открытии файла указатель файла (считывающая головка) устанавливается в 0. Если файл с заданной спецификацией не существовал, функция fopen возвращает NULL. |
w |
Файл открывается для записи. Если файл не существовал он создаётся в заданном директории с именем filename. Если файл существовал указатель файла (считывающая головка) устанавливается в 0. При необходимости сохранения содержимого данного файла необходимо выполнить принудительное позиционирование считывающей головки. Немедленное закрытие файла, после его открытия, приводит к переопределению длины файла, соответствующее текущему положению считывающей головки. |
a |
Файл открывается для пополнения. После открытия файла указатель файла устанавливается на позицию конца файла. В результате при записи в файл сохраняется содержимое файла. |
r+ |
Файл открывается для обновления (чтения и записи). После открытия файла указатель файла устанавливается на позицию 0. Однако немедленное закрытие файла не приводит к его усечению. |
w+ |
Файл открывается для обновления (чтения и записи). Если файл не существовал он создаётся в заданном директории с именем filename. После открытия файла указатель файла устанавливается на позицию 0, а немедленное закрытие файла приводит к его усечению. |
a+ |
Файл открывается для обновления (чтения и записи). После открытия файла указатель файла устанавливается на позицию EOF. Закрытие файла не приводит к его усечению. |
b |
Файл открывается двоичном режиме. Специфицируется двоичный файл путём добавления символа b после символов r,w,a,r+,w+,a+. Например: "r+b","w+b". |
t |
Файл открывается текстовом режиме. Специфицируется текстовый файл путём добавления символа t после символов r,w,a,r+,w+,a+. Например: "r+t","wt". |
printf("введите спецификацию файла");
scanf("%s",filename);
if((fp=fopen(filename,"wb"))==NULL)
perror("");
После завершения работы с файлом (файлами) его необходимо закрыть. Закрытие файла приводит к разрушению внутренней переменной, созданной по шаблону file. При этом, содержимое буфера переносится на диск и выполняется DOS - функция закрытия файла: происходит обновление директория - записывается новый размер файла и изменяется дата и время создания файла. Закрытие файла выполняется при помощи функции fclose().
int _RTLENTRY _EXPFUNC fclose(FILE * __stream);
Int fclose(FILE *fp); - закрывает поток ввода - вывода, на который указывает fp.В случае успеха возвращает 0, в противном случае возвращает eof.
В С - программе допускается одновременное открытие нескольких файлов. При необходимости допускается одновременное закрытие нескольких файлов, выполняемых функцией
int fcloseall(void);
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
int n;float *ga,sx,sy,max;
/*------------------------------------
void WritToD(void)
{ FILE *wfo;char *str;
clrscr();
printf (" Имя победителя?\n");
scanf( "%s",str);
wfo=fopen("E:\\rez.d","a");
fprintf(wfo,"%s-",str);
fprintf(wfo,"%f",max);
fprintf(wfo,"\n");
fclose(wfo);
main();
}