Функции ввода-вывода данных файла



Лабораторная работа № 9

Стандартные файлы и функции по работе с ними. Обработка файлов в потоковом режиме.

I. Общие сведения о файлах в С++

Файл – это именованная область внешней памяти, в которой хранится логически завершенный объем данных. Файл имеет следующие характерные особенности:

· имеет имя на диске, что дает возможность программам идентифицировать и работать с несколькими файлами;

· длина файла ограничивается только емкостью диска.

Часто бывает необходимо ввести некоторые данные из файла или вывести результаты в файл. Например, бывает необходимо обрабатывать массивы, которые слишком велики, чтобы полностью разместиться в памяти.

Особенностью языка С++ является отсутствие в нем структурированных файлов. Все файлы рассматриваются как неструктурированная последовательность байтов. При таком подходе понятие файла распространяется и на различные устройства.

Для эффективного понимания работы с файлами следует ввести абстрактное понятие потока, относящееся к любому переносу данных от источника к приемнику. Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода. Выводимая информация записывается в поток, вводимая информация считывается из потока.

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

Содержимое файлов в С++ может быть представлено в текстовом и двоичном (бинарном) виде.

Текстовый файл – это файл, в котором каждый символ из используемого набора символов хранится в виде одного байта (кода, соответствующего символу). Текстовые файлы разбиваются на несколько строк с помощью специального символа "конец строки". Текстовый файл заканчивается специальным символом "конец файла".

Двоичный (бинарный) файл – файл, данные которого представлены в бинарном виде. При записи в двоичный файл символы и числа записываются в виде последовательности байт (в своем внутреннем двоичном представлении в памяти компьютера).

В С++ операции с файлами можно осуществлять в двух режимах: форматированном (стандарт С) и потоковом (стандарт С++).

 

II. Операции с файлами в форматированном режиме

Функция открытия файла

!!! Для корректной работы в VS 2017 напишите #define _CRT_SECURE_NO_WARNINGS в самом начале до всех #include!!!

Для работы с файлом в языке C++ необходима ссылка на файл. Для определения такой ссылки существует структура FILE, описанная в файле stdio.h. Данная структура содержит все необходимые поля для управления файлами, например: текущий указатель буфера, текущий счетчик байтов, базовый адрес буфера ввода-вывода, номер файла.

При открытии файла (потока) в программу возвращается указатель на поток (файловый указатель), являющийся указателем на объект структурного типа FILE. Этот указатель идентифицирует поток во всех последующих операциях.

Например:

#include<stdio.h>..............FILE *fp;

 

Для открытия файла существует функция fopen, которая инициализирует файл.

 

Синтаксис:

fp=fopen(ИмяФайла, РежимОткрытия);

где fp – указатель на поток (файловый указатель);

ИмяФайла – указатель на строку символов, представляющую собой допустимое имя файла, в которое может входить спецификация файла (включает обозначение логического устройства, путь к файлу и собственно имя файла);

РежимОткрытия – указатель на строку режима открытия файла.

 

Например:

fp=fopen("t.txt","r");

Существуют несколько режимов открытия файлов.

Режимы открытия файлов

Режим Описание Начинается с...
r Открывает текстовый файл для чтения. Если файл не существует, то выдается ошибка при исполнении программы. начала
w Открывает текстовый файл для записи. Если файл не существует, то он создается. Если файл уже существует, то удаляется его содержимое, файл перезаписывается начала
a Открывает текстовый файл для добавления. Если файл не существует, то он создается. Если существует, то содержимое из него не удаляется. конца
r+ Открывает текстовый файл для чтения и записи. Изменить размер файла нельзя. Если файл не существует, то выдается ошибка при исполнении программы. начала
w+ Открывает текстовый файл для чтения и записи. Если файл не существует, то он создается. Если файл уже существует, то удаляется его содержимое, файл перезаписывается. начала
a+ Открывает текстовый файл для чтения и записи. Если файл не существует, то он создается. Если существует, то содержимое из него не удаляется. конца
rb Открывает двоичный файл для чтения. Если файл не существует, то выдается ошибка при исполнении программы. начала
wb Открывает двоичный файл для записи. Если файл не существует, то он создается. Если файл уже существует, то удаляется его содержимое, файл перезаписывается. начала
ab Открывает двоичный файл для добавления. Если файл не существует, то он создается. Если существует, то содержимое из него не удаляется. конца
r+b

Открывает двоичный файл для чтения и записи. Изменить размер файла нельзя. Если файл не существует, то выдается ошибка при исполнении программы.

начала

rb+
w+b

Открывает двоичный файл для чтения и записи. Если файл не существует, то он создается. Если файл уже существует, то удаляется его содержимое, файл перезаписывается.

начала

wb+
a+b

Открывает двоичный файл для чтения и записи. Если файл не существует, то он создается. Если существует, то содержимое из него не удаляется.

конца

ab+

Поток можно открыть в текстовом ( t ) или двоичном ( b ) режиме. По умолчанию используется текстовый режим. В явном виде режим указывается следующим образом:

"r+b" или "rb" – двоичный (бинарный) режим;

"r+t" или "rt" – текстовый режим.

Функция сообщения об ошибках

В файле stdio.h определена константа EOF, которая сообщает об окончании файла (отрицательное целое число).

При открытии файла могут возникать следующие ошибки:

· файл, связанный с потоком не найден (при чтении из файла);

· диск заполнен (при записи);

· диск защищен от записи (при записи) и т. п.

В этих случаях указатель на поток приобретет значение NULL (0). Указатель на поток, отличный от аварийного, не бывает равен NULL.

Для вывода сообщения об ошибке при открытии файла используется стандартная библиотечная функция из файла <stdio.h>:

void perror (const char*s);

Функция perror() выводит строку символов, адресуемую указателем s, за которой размещаются: двоеточие, пробел и сообщение об ошибке. Содержимое и формат сообщения определяются реализацией системы программирования.

Пример 1. Обнаружение и выводошибки при открытии файла.

#include <iostream>using namespace std;int main(){ FILE *fp; if ((fp=fopen("t.txt", "r"))==NULL) // выводит строку символов с сообщением об ошибке perror("ошибка при открытии файла");   system("pause"); return 0;}

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

Функция закрытия файла

Открытые на диске файлы после окончания работы с ними рекомендуется закрыть явно. Это является хорошим тоном в программировании.

Синтаксис:

int fclose(УказательНаПоток);

Возвращает 0 при успешном закрытии файла и -1 в противном случае.

Открытый файл можно открыть повторно (например, для изменения режима работы с ним) только после того, как файл будет закрыт с помощью функции fclose().

Функция удаления файла

Синтаксис:

int remove(const char *filename);

Эта функция удаляет с диска файл, указатель на который хранится в файловой переменной filename. Функция возвращает ненулевое значение, если файл невозможно удалить.

Функция переименования файла

Синтаксис:

int rename(const char *oldfilename, const char *newfilename);

Функция переименовывает файл; первый параметр – старое имя файла, второй – новое. Возвращает 0 при неудачном выполнении.

Функция контроля конца файла

Для контроля достижения конца файла есть функция feof.

int feof(FILE * filename);

Функция возвращает ненулевое значение, если достигнут конец файла.

Функции ввода-вывода данных файла

1) Символьный ввод-вывод

Для символьного ввода-вывода используются функции:

int fgetc(FILE *fp);

где fp – указатель на поток, из которого выполняется считывание.

Функция возвращает очередной символ в формате int из потока fp. Если символ не может быть прочитан, то возвращается значение EOF.

int fputc(int c, FILE*fp);

где fp – указатель на поток, в который выполняется запись;

c – переменная типа int, в которой содержится записываемый в поток символ.

Функция возвращает записанный в поток fp символ в формате int. Если символ не может быть записан, то возвращается значение EOF.


Дата добавления: 2022-12-03; просмотров: 78; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!