Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
метод_к_курс_раб.pdf
Скачиваний:
20
Добавлен:
18.03.2015
Размер:
621.71 Кб
Скачать

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);