Файлы последовательного доступа

Имеется два способа объявления и открытия файла. Первый был описан выше:

ofstream base; // файловый поток для записи (выходной поток)

base.open("base1.box", ios::app); // открыть файл для записи в режиме добавления

Второй способ:

ofstream base("base1.box", ios::app); // открыть файловый поток для записи в режиме добавления

Программному имени base соответствует системное имя файла base1.box. По умолчанию файл текстовый, расширение выбирается произвольно, может быть прочитан с помощью текстового редактора.

Режимы обращения к файлу, если их несколько объединяются операцией “поразрядного или” (обозначается | ) .

Рассмотрим программу, создающую простейшую базу данных, содержащую сведения о сотрудниках фирмы и их зарплатах:

# include < fstream.h >

# include < iomanip.h >

# include < stdlib.h >

# include < windows.h >

char Rustext [256];

char *Rus (const char *text) {

CharToOem ( text, Rustext );

return Rustext ; }

void main ( )

{ofstream base; // файловый поток для записи (выходной поток)

base.open( " base1.box ", ios::app ); //открыть файл для записи в режиме добавления

if ( !base ) {cout << " file error " ;

exit ( 1 ) ; } ; //если файл не существует выход из программы

cout << Rus ( " Введите личный номер, фамилию, зарплату " ) << endl ;

cout << Rus ( " Введите Ctrl+z для окончания ввода " ) << endl ;

int num ;

char name [ 10 ] ;

float balance ;

while ( cin >> num >> name >> balance ) // пока с клавиатуры идут данные

{

base << num << " " << name << " " << balance << endl; // записываем их в поток base

}

base.close ( ) ; // закрыть поток

ifstream bas ( " base1.box " ) ; //файловый поток для чтения (входной поток)

if ( !bas ) { cout << " file error " ;

exit ( 1 ) ; } ; // если файл не существует выход из программы

while ( bas >> num >> name >> balance ) // пока из потока идут данные

{ cout << setw ( 5 ) << num << setw ( 12 ) // идет форматированный вывод на экран

<< name << setw ( 8 ) << balance << endl ;

}

bas.close ( ) ;

}

Ввод и вывод в консольном окне идет в кодировке стандарта ASCII, а текст в текстовых редакторах С++ имеет кодировку в стандарте ANSI. Поэтому для вывода текста, состоящего из букв русского алфавита, надо использовать функцию CharToOem ( ) из библиотеки windows.h. Для удобства использования мы оформили вызов функции CharToOem ( ) в функции Rus( ).

Далее в программе объявляется программный файл base с хранением его содержимого в файле base1.box в режиме записи с добавлением новых записей к уже имеющимся (режим ios::app), если файл ранее не существовал, то он создается. После открытия файла производится проверка успешности открытия файла.

Далее на экран с помощью функции Rus ( ) вводятся указания о порядке ввода данных (№, фамилия, заработная плата). Для окончания записи используется маркер конца файла eof (end of file), который вводится сочетанием клавиш Ctrl+Z (на экране отображается как ^Z).

Запись в файл производится с помощью цикла while. После повторного запуска исполняемого файла программы вводимые данные добавляются в конец файла base1.box. По окончании записи файл закрывается.

Далее открывается файл для считывания и форматированного вывода на экран введенных с клавиатуры данных. Цикл заканчивает работу по достижении конца файла.

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

Задания к самостоятельной работе

1. Записать в двумерный массив размера 8Х8 случайные вещественные числа, значения которых от 0 до 100. Вывести полученный массив на экран и записать в файл в виде выровненной матрицы с двумя знаками после запятой.

2. В файле есть сведения об автомобилях: марка автомобиля, номер и фамилия владельца.

а) Вывести сведения о владельцах и номерах автомобилей каждой марки автомобиля.

б) Подсчитать количество автомобилей каждой марки.

3. Текст записан одной длинной строкой. Признаком красной строки служит символ $. Переформатировать текст в 60-символьные строки, формируя абзацы. Исходный текст должен быть взят из файла, название которого будет введено с клавиатуры, а результирующий текст должен быть выведен в файл «Result_file.txt».

4. Текст, не содержащий собственных имён и сокращений, набран полностью прописными буквами. Заменить все прописные буквы, кроме букв, стоящих после точки, строчными буквами. Исходный текст должен быть взят из файла, название которого будет введено с клавиатуры, а результирующий текст должен быть выведен в файл «Result_file.txt».

5. За стоянку до трех часов парковочный гараж запрашивает плату ми­нимум $2.00. В случае стоянки более трех часов гараж дополнительно запрашивает $0.50 за каждый полный или неполный час сверх трех часов. Максимальная плата за сутки составляет $10.00. Допустим, что никто не паркуется более, чем на сутки за раз. Напишите программу расчета и печати оплаты за парковку для каждого из трех
клиентов, которые парковали свои автомобили вчера в этом гараже. Вы должны вводить длительность парковки для каждого клиента. Ваша программа должна печатать результаты в аккуратном табулированном формате и должна рассчитывать и печатать общий вчерашний доход.
Программа должна использовать функцию calculateCharges, чтобы оп­ределять плату для каждого клиента. Результаты работы должны пред­ставляться в следующем формате:

Автомобиль Часы Плата

1 1.5 2.00

2 4.0 2.50

3 24.0 10.00
Итого 29.5 14.50

Приложение 1.

Существует несколько способов записи алгоритмов. Наиболее популярен графический способ записи – “блок-схема”.

Блок-схема – последовательность блоков предписывающих выполнение определённых действий и связи между ними.

Основные блоки “блок-схемы”
Наименование Обозначение Функции
Пуск, остановка Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Начало, конец, остановка программы, вход и выход из функции (подпрограммы)
Процесс Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Выполнение одной или группы операций
Решение Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Проверка условия, выбор направления выполнения алгоритма
Модификация Файлы последовательного доступа - student2.ru     Цикл
Ввод/вывод Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Ввод данных и вывод результата
Предопределённый процесс Файлы последовательного доступа - student2.ru Файлы последовательного доступа - student2.ru Вызов функции (подпрограммы)
Соединитель Файлы последовательного доступа - student2.ru Разрыв линий схемы алгоритма
Комментарий   - - - [ Пояснение в схеме алгоритма, формулы

Литература

1.Харви Дейтел, Пол Дейтел. Как программировать на С++. Пер. с англ. - Москва: ЗАО "Издательство БИНОМ", 1998. 1024с.

2. Марченко А.Л. C++. Бархатный путь

3. М. Эллис, Б. Страуструп. Справочное руководство по языку C++ с комментариями: Пер. с англ. - Москва: Мир, 1992. 445с.

4. Э.А.Ишкова. С++. Начала программирования – М.: ЗАО «Издательство БИНОМ»,2000. 304 с.

5. Стенли Б. Липпман. C++ для начинающих: Пер. с англ. 2тт. - Москва: Унитех; Рязань: Гэлион, 1992, 304-345сс.

6. Бруно Бабэ. Просто и ясно о Borland C++: Пер. с англ. - Москва: БИНОМ, 1994. 400с.

7. В.В. Подбельский. Язык C++: Учебное пособие. - Москва: Финансы и статистика, 1995. 560с.

8. Т. Сван. Освоение Borland C++ 4.5: Пер. с англ. - Киев: Диалектика, 1996. 544с.

9. Г. Шилдт. Самоучитель C++: Пер. с англ. - Санкт-Петербург: BHV-Санкт-Петербург, 1998. 620с.

10. У. Сэвитч. C++ в примерах: Пер. с англ. - Москва: ЭКОМ, 1997. 736с.

Наши рекомендации