Методические указания по выполнению практической работы по теме: Стандартные функции работы с файлами.


Практическая работа № 5.Стандартные функции работы с файлами.
Цель работы: учиться решать задачи с использованием функций работы с файлами в среде Visual C++.
Теоретическая часть
Файл – это именованная область ячеек памяти, в которой хранятся данные одного типа. Файл имеет следующие характерные особенности:
уникальное имя;
однотипность данных;
произвольная длина, которая ограничивается только емкостью диска.
Файлы бывают текстовыми и двоичными.
Текстовый файл – файл, в котором каждый символ из используемого набора хранится в виде одного байта (код, соответствующий символу). Текстовые файлы разбиваются на несколько строк с помощью специального символа "конец строки". Текстовый файл заканчивается специальным символом "конец файла".
Двоичный файл – файл, данные которого представлены в бинарном виде. При записи в двоичный файл символы и числа записываются в виде последовательности байт (в своем внутреннем двоичном представлении в памяти компьютера).
Все операции ввода-вывода реализуются с помощью функций, которые находятся в библиотеке С++. Библиотека С++ поддерживает три уровня ввода-вывода:
потоковый ввод-вывод;
ввод-вывод нижнего уровня;
ввод-вывод для консоли и портов (зависит от ОС).
Поток – это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику.
Функции библиотеки ввода-вывода языка С++, поддерживающие обмен данными с файлами на уровне потока, позволяют обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизованный ввод и вывод. Таким образом, поток представляет собой этот файл вместе с предоставленными средствами буферизации.
Чтение данных из потока называется извлечением, вывод в поток – помещением (включением).

Рис. 1 Буферизация данных при работе с потоками
Для работы с файлом в языке C++ необходима ссылка на файл. Для определения такой ссылки существует структура FILE, описанная в заголовочном файле stdio.h. Данная структура содержит все необходимые поля для управления файлами, например: текущий указатель буфера, текущий счетчик байтов, базовый адрес буфера ввода-вывода, номер файла.
Функция открытия файла
При открытии файла (потока) в программу возвращается указатель на поток (файловый указатель), являющийся указателем на объект структурного типа FILE. Этот указатель идентифицирует поток во всех последующих операциях.
Например:
#include<stdio.h>
..............
FILE *fp;
Для открытия файла существует функция fopen, которая инициализирует файл.
Синтаксис:
fp=fopen(ИмяФайла, РежимОткрытия);
где fp – указатель на поток (файловый указатель);
ИмяФайла – указатель на строку символов, представляющую собой допустимое имя файла, в которое может входить спецификация файла (включает обозначение логического устройства, путь к файлу и собственно имя файла);
РежимОткрытия – указатель на строку режима открытия файла.
Режимы открытия файлов
Режим Описание Начинается с...
r Открывает текстовый файл для чтения. Если файл не существует, то выдается ошибка при исполнении программы. начала
w Открывает текстовый файл для записи. Если файл не существует, то он создается. Если файл уже существует, то удаляется его содержимое, файл перезаписывается начала
a Открывает текстовый файл для добавления. Если файл не существует, то он создается. Если существует, то содержимое из него не удаляется. конца
r+ Открывает текстовый файл для чтения и записи. Изменить размер файла нельзя. Если файл не существует, то выдается ошибка при исполнении программы. начала
w+ Открывает текстовый файл для чтения и записи. Если файл не существует, то он создается. Если файл уже существует, то удаляется его содержимое, файл перезаписывается. начала
a+ Открывает текстовый файл для чтения и записи. Если файл не существует, то он создается. Если существует, то содержимое из него не удаляется. конца
rbОткрывает двоичный файл для чтения. Если файл не существует, то выдается ошибка при исполнении программы. начала
wbОткрывает двоичный файл для записи. Если файл не существует, то он создается. Если файл уже существует, то удаляется его содержимое, файл перезаписывается. начала
abОткрывает двоичный файл для добавления. Если файл не существует, то он создается. Если существует, то содержимое из него не удаляется. конца
r+bОткрывает двоичный файл для чтения и записи. Изменить размер файла нельзя. Если файл не существует, то выдается ошибка при исполнении программы. начала
rb+ w+bОткрывает двоичный файл для чтения и записи. Если файл не существует, то он создается. Если файл уже существует, то удаляется его содержимое, файл перезаписывается. начала
wb+ a+bОткрывает двоичный файл для чтения и записи. Если файл не существует, то он создается. Если существует, то содержимое из него не удаляется. конца
ab+ Например:
fp=fopen("t.txt","r");
Существуют несколько режимов открытия файлов.
Поток можно открыть в текстовом ( t ) или двоичном ( b ) режиме. По умолчанию используется текстовый режим. В явном виде режим указывается следующим образом:
"r+b" или "rb" – двоичный (бинарный) режим;
"r+t" или "rt" – текстовый режим.
Функция закрытия файла
Открытые на диске файлы после окончания работы с ними рекомендуется закрыть явно. Это является хорошим тоном в программировании.
Синтаксис:
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.
Пример 1.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
FILE *f;
int c;
char *filename="t.txt";
if ((f=fopen(filename,"r"))==0)
perror(filename);
else
while((c = fgetc(f)) != EOF)
putchar(c);
//вывод с на стандартное устройство вывода
fclose(f);
system("pause");
return 0;
}
2) Строковый ввод-вывод
Для построчного ввода-вывода используются следующие функции:
char *fgets(char *s, int n, FILE *f);
где char *s – адрес, по которому размещаются считанные байты;
int n – количество считанных байтов;
FILE *f – указатель на файл, из которого производится считывание.
Прием байтов заканчивается после передачи n-1 байтов или при получении управляющего символа '\n'. Управляющий символ тоже передается в принимающую строку. Строка в любом случае заканчивается '\0'. При успешном завершении считывания функция возвращает указатель на прочитанную строку, при неуспешном – 0.int fputs(char *s, FILE *f);
где char *s – адрес, из которого берутся записываемые в файл байты;
FILE *f – указатель на файл, в который производится запись.
Символ конца строки ( '\0' ) в файл не записывается. Функция возвращает EOF, если при записи в файл произошла ошибка, при успешной записи возвращает неотрицательное число.
Пример 2. Построчное копирование данных из файла f1.txt в файл f2.txt.
#include "stdafx.h"
#include <iostream>
using namespace std;
#define MAXLINE 255 //максимальная длина строки
int main()
{
//копирование файла in в файл out FILE *in, //исходный файл
*out; //принимающий файл
char buf[MAXLINE];
//строка, с помощью которой выполняется копирование
in=fopen("f1.txt","r");
//открыть исходный файл для чтения
out=fopen("f2.txt","w");
//открыть принимающий файл для записи
while(fgets(buf, MAXLINE, in)!=0)
//прочитать байты из файла in в строку buf fputs(buf, out);
//записать байты из строки buf в файл out fclose(in); //закрыть исходный файл
fclose(out);//закрыть принимающий файл
system("pause");
return 0;
}

Ход работы
Создайте новое консольное приложение С++ (Файл→Создать→Проект→ “Консольное приложение Win32”).
Напишите программу обнаружения и вывода ошибки при открытии файла.
30524451858645==NULL)
020000==NULL)

Пояснение к коду:
В файле stdio.h определена константа EOF, которая сообщает об окончании файла (отрицательное целое число).
При открытии файла могут возникать следующие ошибки:
файл, связанный с потоком не найден (при чтении из файла);
диск заполнен (при записи);
диск защищен от записи (при записи) и т. п.
В этих случаях указатель на поток приобретет значение NULL (0). Указатель на поток, отличный от аварийного, не бывает равен NULL.
Для вывода сообщения об ошибке при открытии файла используется стандартная библиотечная функция из файла <stdio.h>:
void perror (const char*s);
Функция perror() выводит строку символов, адресуемую указателем s, за которой размещаются: двоеточие, пробел и сообщение об ошибке.
Внимательно изучите код и комментарии к нему.
Выполните примеры 1 и 2 из теоретической части. Внимательно построчно разберите код.
Напишите программу подсчета количества символов в заданном тексте и файловый ввод-вывод данных. Работа программы должна включать ввод пользователем с клавиатуры имен входного и выходного файлов. Результат работы программы сохраняется в выходном файле, а также выводится на экран.

Внимательно изучите код и комментарии к нему.
Выполните отладку (F5) и проверьте работоспособность программы.
Дополнительное задание.
По аналогии с предыдущими примерами напишите программный код:
определения чаще всего встречающейся в заданном файле буквы;
удвоения в содержимом файла каждой литеры;
подсчёта числа цифр в данном файле и их суммы.
Покажите выполненную работу преподавателю и получите дополнительное задание.
Ответьте на контрольные вопросы.
Контрольные вопросы:
Дайте определение понятию “файл”.
Дайте определение понятию “поток”.
Перечислите функции открытия, закрытия, удаления, переименовывания файла?
Где находится описание структуры FILE?
Каково назначение fp в строке fp =fopen(ИмяФайла, РежимОткрытия); ?