Функции работы с файлами в среде Visual C++


Практическая работа № 10.Функции работы с файлами.
Цель работы: учиться решать задачи с использованием функций работы с файлами в среде Visual C++.
Теоретическая часть
Поток — это общее название, как ни странно, потока данных. В C++ поток представляет собой объект некоторого класса. Именно поэтому вы могли встретить в листингах потоковые объекты cin и cout.
Преимущества потоковПрограммисты на C могут удивиться, какие же преимущества дает использование потоковых классов для ввода/вывода вместо традиционных функций C printf(), scanf(), для файлов — fprintf(), fscanf()...
Одним из аргументов в пользу потоков является простота использования. Если вам приходилось когда-нибудь использовать символ управления форматом %d при форматировании вывода с помощью %f в printf(), вы оцените это. Ничего подобного в потоках вы не встретите, ибо каждый объект сам знает, как он должен выглядеть на экране. Это избавляет программиста от одного из основных источников ошибок.
Файл – это именованная область ячеек памяти, в которой хранятся данные одного типа. Файл имеет следующие характерные особенности:
уникальное имя;
однотипность данных;
произвольная длина, которая ограничивается только емкостью диска.
Файлы бывают текстовыми и двоичными.
Текстовый файл – файл, в котором каждый символ из используемого набора хранится в виде одного байта (код, соответствующий символу). Текстовые файлы разбиваются на несколько строк с помощью специального символа "конец строки". Текстовый файл заканчивается специальным символом "конец файла".
Двоичный файл – файл, данные которого представлены в бинарном виде. При записи в двоичный файл символы и числа записываются в виде последовательности байт (в своем внутреннем двоичном представлении в памяти компьютера).
Все операции ввода-вывода реализуются с помощью функций, которые находятся в библиотеке С++. Библиотека С++ поддерживает три уровня ввода-вывода:
потоковый ввод-вывод;
ввод-вывод нижнего уровня;
ввод-вывод для консоли и портов (зависит от ОС).
Поток – это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику.
Функции библиотеки ввода-вывода языка С++, поддерживающие обмен данными с файлами на уровне потока, позволяют обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизованный ввод и вывод. Таким образом, поток представляет собой этот файл вместе с предоставленными средствами буферизации.
Чтение данных из потока называется извлечением, вывод в поток – помещением (включением).

Рис. 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 _tmain(int argc, _TCHAR* argv[]){
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.

Замечание: отобразите окно свойств для элементов (Вид→Другие окна→Окно свойств или Alt+Enter).
109220238125форма
00форма

Замечание: знакомьтесь с назначением элементов формы, просматривая всплывающие подсказки:
2780030106553000
Стандартное содержимое вашего проекта можно увидеть в Обозревателе решений:


Ход работы
Создайте новый проект С++ (Файл→Создать→Проект→ВыбратьCLR+“Приложение Windows Forms”).
Разместите на форме:
элемент MenuStrip;
элемент openFiledialog;
элемент saveFiledialog;
элемент textBox1.
Примерный вид формы с необходимыми элементами:

Измените свойства для следующих элементов:
для Form1 – Text= Создание меню;
для textBox1 – Multeline, ScrollBars=Vertical.
Примерный вид формы:

Определите поле Файл для меню:
кликните по текстовому полю "Вводить здесь";
введите имя пункта – "Файл”.
Добавьте остальные пункты:
в нижнем новом появившемся текстовом поле напишите "Открыть";
аналогично добавьте "Сохранить как".

Определите возможность textBox изменяться пропорционально размеру формы при увеличении окна (по умолчанию textBox “привязан” к левой и верхней части формы). Для этого задайте свойство Achor для textBox1. Выделите правую и нижнюю часть, после чего размер элемента textBox будет изменяться как надо.
Выполните отладку (F5) и проверьте работоспособность. Ширина и высота textBox меняется автоматически.

Внимательно построчно разберите нижеприведённый код. Напишите код обработки событий для добавленных элементов:
124206078359000
1304925584835001791335333629000
Добавьте пункт меню Файл – Выход, код для него: this->Close();
Выполните отладку (F5) и проверьте работоспособность.
Примерный результат работы вашей программы:

Покажите выполненную работу преподавателю и получите дополнительное задание.
Ответьте на контрольные вопросы.
Контрольные вопросы:
Какова функция элемента MenuStrip?
Что определяет свойство Vertical элемента формы textBox?
Как создать элемент формы “вкладка”?
Что определяет свойство FileName элемента формы openFileDialog1?