Лабораторная работа №14 / 15_файлы_a5.doc
Лабораторная работа №15
Работа с файловыми потоками в С++.
Текстовые файлы
Цель работы: получить практические навыки решения задач с использованием текстовых файлов на языке С++.
Теоретические сведения
Потоковый ввод/вывод дисковых файлов
Для работы с дисковыми файлами необходимо подключение заголовочного файла <fstream>, содержащего наборы специальных классов:
ifstream — для ввода,
ofstream — для вывода,
fstream — для чтения и записи данных в один и тот же файл.
Чтобы получить возможность работать с дисковым файлом, нужно открыть его с указанием режима доступа, который определяется значением константы open-mode класса ios.
Режим доступа | Стандарт | Действие |
app | нет | открывает файл для дозаписи |
ate(atend) | да | при открытии файла устанавливает файловый указатель на конец файла |
binary(bin) | да | открыть файл в двоичном представлении |
in | да | открыть файл для чтения (ввода) |
nocreate | нет | если файл не существует, то новый файл не создается |
Режим доступа | Стандарт | Действие |
noreplace | нет | если файл уже существует, файл не перезаписывается |
out | да | открыть файл для записи (вывода) |
trunc | нет | Открывает и усекает существующий файл. Новая информация замещает существующую |
Текстовые файлы
Создание и запись.
Для создания текстового файла определяют объект класса ofstream и передают конструктору класса имя дискового файла в качестве первого параметра и режим доступа в качестве второго параметра:
ofstream out_file(“Out.txt”, ios::out);
Можно объявить константу, определяющую режим открытия файла, например:
const ios::open_mode=ios::out | ios::app;
После того, как предпринималась попытка открыть файл, следует убедиться в том, что файл открыт и готов для записи (или перезаписи):
if (! out_file) { cerr<<”Error: unable to write to out.txt”<<endl;
exit(1);
}
Все сказанное верно и для файлов, открываемых для чтения (или входных файлов):
ifstream in_file(“Input.txt”, ios::in);
if (! in_file) { cerr<<”Error: unable to open Input.txt”<<endl;
exit(1);
}
При работе с текстовыми файлами наиболее часто встречаются четыре действия:
|
|
Посимвольное чтение текста.
Функция get(), которая является методом istream, применяется для посимвольного чтения текстового файла.
Пример 15.1. Посимвольное чтение файла и вывод его на экран.
# include <fstream>
# include <iostream>
using namespace std;
int main()
{ char sym;
ifstream in_file (“Input_file.txt”, ios::in);
if (! in_file) { cerr<<”Error input file”<<endl;
exit(1);
}
while (in_file) { in_file.get(sym);
cout<<sym;
}
cout<<endl;
return 0;
}
Посимвольная запись текста.
Функция put(), которая является методом ostream, позволяет осуществлять посимвольную запись данных в текстовый файл.
Пример 15.2.
# include <fstream>
# include <iostream>
# include <string>
using namespace std;
void main()
{ string guote = “Зорко одно лишь сердце. Самого главного глазами не увидишь. А. де Сент Экзюпери”;
ofstream out_file (“Out_file.txt”, ios::out);
if (! out_file) { cerr<<”Error output file”<<endl;
exit(1);
}
for (int i=0; i<guote.size(); i++)
out_file.put(guote[i]);
cout<<”Конец записи”<<endl;
}
Построчное чтение файла.
Обычно построчное чтение и запись файлов работают быстрее посимвольных действий. Для чтения строки из файла воспользуемся функцией getline(), которая является методом класса ifstream. Функция читает строку (в том числе и разделители), пока не встретит символ новой строки `\n', помещая ее в буфер (первый аргумент функции). Максимальный размер буфера задается как второй аргумент функции.
Пример 15.3.
# include <fstream>
# include <iostream>
using namespace std;
void main()
{ const int LEN=80;
char BUF[LEN];
ifstream in_file (“Input_file.txt”, ios::in);
if (! in_file) { cerr<<”Error input file”<<endl;
exit(1);
}
while (in_file) { in_file.getline(BUF,LEN);
cout<<BUF<<endl;
}
}
Построчная запись текста.
Пример 15.4.
# include <fstream>
# include <iostream>
# include <string>
using namespace std;
void main()
{ ofstream out_file (“Out_file.txt”, ios::out);
if (! out_file) { cerr<<”Error output file”<<endl;
exit(1);
}
out_file<<”Я не знаю, где встретиться\n”;
out_file<<”Нам придется с тобой,\n”;
out_file<<”Глобус крутится-вертится,\n”;
out_file<<”Словно шар голубой\n”;
}
Записываемые строки являются не объектами класса string, а строками типа *char, завершающимися символом `\n'.
Признак конца файла
Признак конца файла приходится искать в файлах, открытых для чтения. Этот признак устанавливается в тот момент, когда в файле не осталось больше данных, которые можно считать.
Признак конца файла анализируется в выражении вида
while (! In_file.eof()) { … }
Для этой цели нельзя пользоваться циклом
do { … } while (! In_file.eof()), поскольку файл может оказаться пустым.
Однако проверка на конец файла не анализирует ошибки, которые могут встретиться в процессе чтения файла.
Для проверки как конца файла, так и наличия ошибок при его чтении пользуются условием выхода из цикла:
while (In_file.good()) { … }
Оператор цикла
while (In_file) { … }
выполняется до тех пор, пока нет ошибок, в том числе и конца файла (EOF).
Имена файлов и аргументы командной строки
В приведенных выше примерах были использованы файлы с фиксированными именами. Однако более удобны программы, в которых имена файлов для чтения или записи можно ввести с клавиатуры или задать в качестве аргументов командной строки.
Пример 15.5.
# include <fstream>
# include <iostream>
# include <stdlib.h>
using namespace std;
int main (int argc, char *argv[])
{ char I;
char c;
if (argc<=1) { cout<<”usage: primer.exe filename1 [filename2]”;
return 1;
}
ifstream file;
for(I=1;I<argc-1;I++)
{ if(!file.open(argv[I])) { cout<<”Bad file”;
return 1;
};
cout<<”file “<<argv[I]<<endl;
while(file)
{ c=file.get();
cout<<c;
};
file.close();
}
return 0;
}
Для работы с файловыми потоками любого из стандартных типов, нужно перегрузить операторы ввода и вывода под требуемый тип данных или воспользоваться шаблоном класса, задаваемым с помощью ключевого слова template.
Требования к отчету
Отчет должен содержать:
наименование и цель работы;
краткие теоретические сведения;
формулировку задания своего варианта;
схему алгоритма
текст программы для варианта задания, соответствующего номеру фамилии студента в группе (если студент закреплен за определенной ЭВМ, имеющей номер, то номеру ЭВМ);
результаты выполнения программы.
Контрольные вопросы
Что такое поток?
Что представляет собой файловый указатель?
Перечислить режимы доступа к файлу.
Как открыть и как закрыть файл?
Лабораторное задание
Для выполнения лабораторной работы необходимо составить программу согласно своему варианту задания из табл.15.1 и (или) из табл.15.2 по указанию преподавателя.
Варианты заданий
Таблица 15.1
Номер варианта | Задание |
1, 14 | Дан файл f, компоненты которого являются целыми числами. Записать в файл g, компоненты файла f, исключив повторные вхождения чисел. |
2, 15 | Дан файл f, компоненты которого являются действительными числами. Найти:
|
3, 16 | Дан символьный файл f. Подсчитать число вхождений в файл каждой из букв a, b, c, d, e, f. Результат вывести в файл g в виде таблицы с комментариями. |
4, 17 | Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа исходного файла, в файл h - все нечетные. Порядок следования чисел сохраняется. Записать в файл g и h комментарии. |
Номер варианта | Задание |
5, 18 | Дан текстовый файл, содержащий программу на языке С. Проверить эту программу на соответствие числа открывающих и закрывающих фигурных скобок. |
6, 19 | Дан символьный файл f. Найти и записать в файл g самое длинное слово файла f, снабдив его комментарием. |
7, 20 | Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f:
Записать в файл g комментарий. |
8, 21 | Дан файл f. Создать два файла, записав в первый из них все четные числа, расположив их в порядке возрастания, а во второй - все нечетные, расположив их в порядке убывания. |
9, 22 | Дан текстовый файл f. Переформатировать исходный файл, разделяя его на строки так, чтобы каждая строка содержала столько символов, сколько содержит самая короткая строка исходного файла. |
10, 23 | Дан файл f. Создать два файла, записав в первый из них среднее геометрическое всех четных чисел, а во второй - среднее арифметическое всех нечетных чисел. |
11, 24 | Дан числовой файл f. Выбрать все значения, которые делятся нацело на 2 и 4, но не делятся на 6. Записать эти значения в файл g, а все остальные - в файл h. |
12, 25 | Дан текстовый файл f. Определить, являются ли первые два символа цифрами и если да, то четно ли это число. Записать его в файл g, если оно четно и в h ,если оно нечетно. |
13, 26 | Дан текстовый файл f. Создать новый файл g и переписать в него исходный файл в обратном порядке, разделив пробелами. |
Таблица 15.2
Номер варианта | Задание |
1, 14 | Сформировать массив на диске, содержащий сведения о пациентах глазной клиники. Структурный тип содержит поля: фамилия пациента, пол, возраст, место проживания (город), диагноз. Написать программу, которая выбирает необходимую информацию с диска и выводит на экран: - количество иногородних, прибывших в поликлинику; - список пациентов старше Х лет с диагнозом J. |
2, 15 | Сформировать массив на диске, содержащий сведения о сотрудниках института. Структурный тип содержит поля: фамилия работающего, название отдела, год рождения, стаж работы, должность, оклад. Написать программу, которая выбирает необходимую информацию с диска и выводит на экран: - список сотрудников пенсионного возраста на сегодняшний день с указанием стажа работы; - средний стаж, работающих в отделе Х. |
3, 16 | Сформировать массив на диске, содержащий сведения об отправлении поездов дальнего следования с Казанского вокзала. Структурный тип содержит поля: номер поезда, станция назначения, время отправления, время в пути, наличие билетов. Написать программу, которая выбирает необходимую информацию с диска и выводит на экран: - время отравления поездов в город Х во временном интервале от А до В часов; - наличие билетов на поезд с номером ХХХ. |
Номер варианта | Задание |
4, 17 | Сформировать массив на диске, содержащий сведения о том, какие из пяти предлагаемых дисциплин по выбору желает изучать студент. Структурный тип содержит поля: фамилия студента, индекс группы, пять дисциплин, средний балл успеваемости. Выбираемая дисциплина отмечается символом 1, иначе - пробелом. Написать программу, которая выбирает необходимую информацию с диска и выводит на экран список студентов, желающих прослушать дисциплину X. Если число желающих превышает 4 человека, то отобрать студентов, имеющих более высокий средний балл успеваемости. |
5, 18 | Сформировать массив на диске, содержащий сведения о нападающих команды «Спартак». Структурный тип содержит поля: имена нападающих, число заброшенных ими шайб, число сделанных голевых передач, заработанное штрафное время. Написать программу, которая выбирает необходимую информацию с диска и выводит на экран четырех лучших игроков по сумме очков (голы + передачи). |
6, 19 | Сформировать массивна диске, содержащий сведения об ассортименте обуви в магазине фирмы. Структурный тип содержит поля: артикул, наименование, количество, стоимость одной пары. Артикул начинается с буквы Д - для дамской обуви, М - для мужской, П - для детской. Написать программу, которая выбирает необходимую информацию с диска и выводит на экран: - сведения о наличии и стоимости обуви артикула X; - ассортиментный список дамской обуви с указанием наименования и имеющегося в наличии числа пар каждой модели. |
Номер | Задание |
7, 20 | Сформировать массив на диске, содержащий сведения о наличии билетов на рейсы аэрофлота. Структурный тип содержит поля: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест в салоне. Написать программу, которая выбирает необходимую информацию с диска и выводит на экран: - время вылета самолетов в город X; - наличие свободных мест на рейс в город X с временем отправления Y. |
8, 21 | Сформировать массив на диске, содержащий сведения о личной коллекции книголюба. Структурный тип содержит поля: шифр книги, автор, название, год издания, местоположение (номер стеллажа). |
