- •ВВЕДЕНИЕ
- •1. ТЕМАТИКА КУРСОВЫХ РАБОТ
- •2. ЗАДАНИЕ НА ТИПОВУЮ КУРСОВУЮ РАБОТУ
- •3. СОДЕРЖАНИЕ ПОЯСНИТЕЛЬНОЙ ЗАПИСКИ
- •3.1 Перечень основных разделов
- •4. ВСПОМОГАТЕЛЬНЫЙ МАТЕРИАЛ
- •4.1 Перечень вопросов, подлежащих изучению
- •4.2. Создание и обработка файлов
- •4.3. Ввод/вывод для типов, определенных пользователем
- •Литература
- •Приложение 2 Пример текста программы с минимальным набором функций
- •Содержание
8
-выполнить проверку конкретных значений контрольного примера по всем предусмотренным в ТЗ функциям;
-распечатать полученный файл с протоколом работы программы, включающий распечатку данных и, если требуется, пояснения результатов.
3.2.8Условия использования программного комплекса
Вэтом разделе должны быть приведены технические условия и состав программного обеспечения для работы вышеописанного ПК.
Указать персональную ЭВМ, на которой был отлажен ПК, операционную систему, язык программирования, указав версию. Привести состав файлов, входящих в ПК в следующем виде: имя файла с расширением - размер в байтах - назначение.
Размер ПК указать в исходном виде и в готовом к выполнению, т.е. привести размеры файлов с расширением ".cpp",".exe".
Привести размеры файлов данных с указанием числа записей.
3.2.9 Список используемой литературы
Список литературы приводится по общепринятым правилам для технической литературы. На приведенную литературу должны быть сделаны ссылки в тексте пояснительной записки.
4.ВСПОМОГАТЕЛЬНЫЙ МАТЕРИАЛ
4.1Перечень вопросов, подлежащих изучению
Впроцессе выполнения работы студент должен разобраться в следующих вопросах:
-основы файлового ввода/вывода информации;
-произвольный доступ к файлу;
-организация ввода/вывода для типов, определенных пользователем.
Вкурсовой работе рассматриваются типизированные и текстовые файлы, прямой и последовательный доступы к данным.
9
Студенту необходимо прежде всего понимать как распространяется блок описания данных на текст программы, что такое файл, поток ввода и вывода, внешнее имя файла, объявление файла в программе, связь потока ввода-вывода с внешнем именем файла в среде операционной системы.
4.2.Создание и обработка файлов
4.2.1.Основы файлового ввода/вывода
Файловый ввод/вывод поддерживается той же иерархией классов, что и консольный ввод/вывод. Для реализации файлового ввода/вывода, необходимо включить в программу заголовочный файл <fstream.h>, в котором определено несколько классов, включая ifstream, ofstream и fstream.
В С++ файл открывается посредством его связывания с потоком. Имеется три типа потоков: ввода, вывода и ввода/вывода. Перед тем как открыть файл, нужно, во-первых, создать поток. Для создания потока ввода необходимо объявить объект типа ifstream. Для создания потока вывода – объект типа ofstream. Потоки, которые реализуют одновременно ввод и вывод должны объявляться как объекты типа
fstream. |
|
Например: |
|
ifstream fin; |
// создание потока ввода |
ofstream fout; |
// создание потока вывода |
fstream fio; |
// создание потока ввода/вывода |
После создания потока, одним из способов связать его с файлом является использование функции open(). Эта функция является членом каждого из трех потоковых классов.
Прототипы данной функции для каждого класса такие:
void ifstream::open( char *имя_файла, openmode режим = ios::in);
void ofstream::open( char *имя_файла, openmode режим = ios::out | ios::trunc);
void fstream::open( char *имя_файла, openmode режим = ios::in | ios::out);
10
Здесь имя_файла – имя файла, в которое может входить и спецификатор пути. Значение режим задает режим открытия файла. Оно должно быть значением типа openmode, которое является перечислением, определенным в классе ios. Значение режим может быть одним из следующих:
ios::app
ios::ate
ios::binary
ios::in
ios::nocreate
ios::noreplace
ios::trunc
ios::app – открытие файла в режиме добавления в конец файла. Это значение может применяться только к файлам, открываемым для вывода (записи информации в файл);
ios::ate – поиска конеца файла при его открытии. Хотя данное значение вызывает поиск конца файла, тем не менее, операции ввода/вывода могут быть выполнены в любом месте файла;
ios::in – открытие файла для ввода (чтения информации из файла); ios::out – открытие файла для вывода (записи информации в файл); ios::binary – открытие файла в двоичном режиме. По умолчанию все файлы открываются в текстовом режиме. В текстовом режиме имеет
место преобразование некоторых символов, например, последовательность символов “вовзрат каретки/перевод строки” превращается в символ новой строки. Если же файл открывается в двоичном режиме, такого преобразования не выполняется. Любой файл, независимо от отго, что в нем содержится – отформатированный текст или необработанные данные – может быть открыть как в текстовом, так и в двоичном режиме. Отличие между ними только в отсутствии или наличии упомянутого символьного преобразования;
ios::nocreate – не открывать новый файл. Открытие терпит неудачу, если файл не существует;
ios::noreplace – не открывать существующий файл. Открытие терпит неудачу, если файл существует;
11
ios::trunc- удаление содержимого ранее существовавшего файла с тем же названием и усечению его до нулевой длины. При создании потока вывода с помощью ключевого слова ofstream любой ранее существовавший файл с тем же именем автоматически усекается до нулевой длины.
Пример открытия файла prim.txt для вывода:
ofstream mystream; |
// создание потока вывода |
mystream.open(“prim.txt”); |
// связывание потока вывода с файлом |
//prim.txt
Вэтом примере параметр режим функции open() по умолчанию устанавливается в значение, соответствующее типу открываемого потока, поэтому нет необходимости указывать его явно.
Как правило, перед тем как пытаться получить доступ к файлу, следует проверить результат выполнения функции open().
Для проверки правильности открытия файла используют операцию НЕ (!).
Пример проверки открытия файла с помощью операции НЕ:
if ( !mystream )
{
cerr << “Не удалось открыть файл\n”;
// программа обработки ошибки открытия файла
}
Для открытия файлов помимо функции open() можно использовать конструкторы классов ifstream, ofstream и fstream, которые открывают файлы автоматически. Конструкторы имеют те же параметры, в том числе и задаваемые по умолчанию, что и функция open().
Пример открытия файла prim1.txt для ввода (чтения из файла) с помощью конструктора:
ifstream fi(“prim1.txt”);
12
Для закрытия файла используется функция close().
Например, для закрытия файла, связанного с потоком fi используется инструкция:
fi.close();
После того как файл открыт, в него можно записать или прочитать из него данные. Для этого можно использовать операторы << и >> так же, как это делалось для консольного ввода/вывода, только следует заменить поток cin или cout тем потоком, который связан с файлом. Однако в С++ для работы с файлами поддерживается широкий диапазон функций ввода/вывода.
4.2.2. Основные функции ввода
istream& get(char &символ); - считывает один символ из связанного с ней потока и передает его значение аргументу символ. Ее возвращаемым значением является ссылка на поток.
istream &get( char *буфер, int число_байт); - считывает символы в массив, определенный указателем буфер, до тех пор, пока либо не считано столько символов, сколько задано параметром число_байт, либо не встретился символ конца файла. В конце массива, заданного указателем буфер, функция get() помещает ноль. Если в потоке ввода встретится символ новой строки, он не извлекается, а остается в потоке до следующей операции ввода.
istream &get( char *буфер, int число_байт,
char ограничитель=’\n’); - считывает символы в массив, определенный указателем буфер, до тех пор, пока либо не считано столько символов, сколько задано параметром число_байт, либо не встретился символ, заданный параметром ограничитель=’\n’, либо не встретился символ конца файла. В конце массива, заданного указателем буфер, функция get() помещает ноль. Если в потоке ввода встретится символ ограничитель, он не извлекается, а остается в потоке до следующей операции ввода.
int get(); - возвращает из потока следующий символ. Она возвращает символ конца файла в случае достижения конца файла.
13
istream &getline(char *буфер, int число_байт,
char ограничитель = '\n'); -
считывает символы в массив, обозначенный указателем буфер, до тех пор, пока либо не считано столько символов, сколько задано параметром число_байт, либо не встретился символ ограничитель=’\n’, либо не встретился символ конца файла. В конце массива, заданного указателем буфер, функция getline() помещает ноль. Если в потоке ввода встретится символ ограничитель, он извлекается, но не помещается в массив.
int peek(); - возвразщает следующий символ из потока ввода или, если достигнут конец файла, символ конца файла, без его удаления из потока.
istream &putback(char символ); - возвращает последний считанный из потока символ обратно в поток.
istream& read(char *буфер, int число_байт); - считывает из вызывающего потока столько байт, сколько задано в аргументе число_байт и передает их в буфер, определенный указателем буфер. Если конец файла достигнут до того, как было считано число_байт символов, выполнение функции просто прекращается, а в буфере оказывается столько символов, сколько их было в файле.
4.2.3. Основные функции вывода
ostream &put (char символ); - записывает символ в поток и возвращает ссылку на поток.
ostream & write(char *буфер, int число_байт); - записывает в соответствующий поток из буфера, который определен указателем буфер, заданное аргументом число_байт число байтов.
ostream &flush(); - вызывает физическую запись информации на диск до заполнения буфера.
14
4.2.4. Произвольный доступ
Система ввода/вывода С++ управляет двумя указателями, связанными с файлом. Первый – это указатель считывания (get pointer), который задает следующее место в файле, откуда будет вводиться информация. Второй – это указатель записи (put pointer), который задает следующее место в файле, куда будет выводиться информация. При каждом вводе или выводе соответствующий указатель последовательно продвигается дальше. Однако, с помощью функций произвольного доступа возможен непосредственный доступ к файлу.
4.2.4.1. Функции управления указателем считывания
istream &seekg(long смещение); - устанавливает указатель считывания соответствующего файла на абсолютную позицию, заданную величиной смещение.
istream &seekg(long смещение, seek_dir задание); -
устанавливает указатель считывания соответствующего файла в позицию, отстоящую на величину смещение от заданного места задание.
Тип seek_dir – это перечисление (enum), определенное в классе ios следующим образом:
enum seek_dir { beg=0, cur=1, end=2 };
Значения данного перечисления имеют такой смысл: ios::beg – отсчет от начала файла;
ios::cur – отсчет от текущий позиции указателя; ios::end - отсчет от конца файла.
long tellg(); - возвращает текущую позицию указателя считывания в потоке ввода.
15
4.2.4.2. Функции управления указателем записи
ostream &seekp(long смещение); - устанавливает указатель записи соответствующего потока на абсолютную позицию, заданную величиной
смещение.
ostream &seekp(long смещение, seek_dir задание); -
устанавливает указатель записи соответствующего файла в позицию, отстоящую на величину смещение от заданного места задание. (Тип seek_dir имеет такие же значения как и в функции seekg.)
long tellp(); - возвращает текущую позицию указателя записи в потоке вывода.
4.2.5.Контроль состояния ввода/вывода
Всистеме ввода/вывода С++ поддерживается информация о состоянии после каждой операции ввода/вывода. Текущее состояние потока ввода/вывода, которое хранится в объекте типа io_state, является перечислением, определенным в классе ios и содержащим следующие члены:
Название |
Значение |
goodbit |
Ошибок нет |
eofbit |
Достигнут конец файла |
failbit |
Имеет место нефатальная ошибка |
badbit |
Имеет место фатальная ошибка |
Получить информацию о текущем состоянии ввода/вывода можно с помощью следующих функций:
int rdstate(); - возвращает текущее состояние потока;
int eof(); – возвращает ненулевое значение при условии достижения конца файла (установлен флаг eofbit);
int fail(); - возвращает ненулевое значение, если операция терпит неудачу (установлен флаг failbit);