Лаб.практикум_2
.pdf14, 29 В составе программы описать функцию, которая удаляет из списка все вхождения элемента Е, значение которого введено с клавиатуры.
15, 30 В составе программы описать функцию, которая меняет мес- тами наибольший и наименьший элемент.
21
PDF created with pdfFactory Pro trial version www.pdffactory.com
Лабораторная работа № 3. Программирование задач с использованием файловых потоков
Цель работы: изучение различных способов программирования с использованием файловых потоков; получение практических навыков программирования задач с использованием файловых потоков.
Теоретические сведения
Поток − это общий последовательный логический интерфейс с различными устройствами, входящими в состав компьютера (дисплей, клавиатура, принтер, жесткий диск и др.). В общем случае можно сказать, что поток – это логический интерфейс, который связан с файлом, в том числе и с физическим файлом, раз- мещаемым или размещенным в дисковом пространстве компьютера (жестком диске).
Существуют два вида потоков (файлов): текстовый и двоичный (бинарный). Текстовый поток предна- значен для ввода/вывода символьных данных, при этом могут происходить некоторые преобразования сим- волов. Например, символ новой строки может быть преобразован при выводе в последовательность из двух символов: возврат каретки и переход на новую строку. В свою очередь при работе с бинарным потоком ни- какого преобразования символов не происходит. Введем понятие текущей позиции или указателя потока (файла) – это место в потоке (файле), с которого будут выполняться операции доступа к компонентам пото- ка.
В С++ все операции, связанные с файловыми потоками, определены в fstream. Поэтому в разделе ди- ректив необходимо указать #include <fstream>.
Для открытия файла необходимо его связать с потоком. В С++ имеются три вида потоков:
∙ifsteam – входной поток. Используется только для чтения информации из файла;
∙ofsream – выходной поток. Используется только для вывода информации в файл;
∙fstream – двунаправленный поток. Используется для чтения и записи в файл.
Открытие файла выполняется с помощью функции open(). При открытии можно указать способ откры- тия файла: открытие для дозаписи информации в конец файла, открытие бинарного файла, открытие только для чтения или только для записи и др.
Например, если необходимо открыть бинарный файл «text» для чтения и записи, то следует записать: fstream file;
file.open(“text”, ios::binary || ios::in || ios::out);
Функция open() при успешном открытии файла вернет значение TRUE, в противном случае, если файл не будет открыт по каким-то причинам, вернет значение FALSE. Поэтому для проверки открытия файла рекомендуется использовать оператор if:
if(!file) cout<<“Не удается открыть файл”; return 1;
После работы с файлом его следует закрыть, особенно это важно, если выполнялись операции записи в файл. Закрытие файла выполняется с помощью функции close(): file.close();
Чтение и запись данных текстовых файлов. При чтении или записи данных в текстовый файл можно использовать операторы << и >>. Например, для чтения целочисленной переменной x из файлового потока
22
PDF created with pdfFactory Pro trial version www.pdffactory.com
in необходимо использовать оператор: in>>x; а для записи в выходной файловый поток out значения цело- численной переменной x: out<<x;
Функция проверки достижения конца файла. Для того чтобы проверить, достигнут ли конец файла, используется функция eof(). Данная функция возвращает значение TRUE при обнаружении конца файла и FALSE – в противном случае.
Чтение и запись данных бинарных файлов. При работе с бинарными (двоичными) файлами для чте- ния/записи символов в файл используются функции get() и put().
Прототипы функций: istream &get(char &ch); ostream &put(char ch);
Функция get() считывает из файлового потока символ и помещает его в переменную ch. Функция put() записывает значение переменной ch в файловый поток.
Считывание и запись в файл блоков данных. Для считывания и записи блоков данных используются функции read() и write().
Прототипы функций:
istream &read(char *buf, streamsize num); ostream &write(const char *buf, streamsize num);
Функция read() считывает num байт данных из связанного с файлом потока в буфер buf. Функция write () записывает num байт данных в связанный с файлом поток из буфера buf. Тип streamsize является разно- видностью целого типа. Он позволяет хранить самое большое количество байтов, которое может быть пере- дано в процессе любой операции ввода/вывода.
Рассмотрим пример, использующий данные функции. Пусть имеется следующая структура данных:
struct Tutors
{
char name[25]; int years; char step[10]; int stag;
};
В следующем фрагменте программы показано использование функций read и write при записи и чтении блоков данных, являющихся элементами структуры:
Tutors t[10]={ "Иванов",25,"ktn",3, "Петров",45,"no",20, "Сидоров",35,"ktn",6, "Куликов",58,"dtn",30, "Морозов",45,"ktn",22, "Малышева",43,"no",10, "Мартынова",50,"ktn",28, "Яров",60,"ktn",35, "Мышкин",39,"no",17, "Филиппова",45,"ktn",18 };
. . .
ofstream out;
out.open(name, ios::binary);
if(!out){cout<<"файл для чтения "<<name<<" не открыт"<<endl; return 1;} out.write((char* ) &t,sizeof t);
out.close();
23
PDF created with pdfFactory Pro trial version www.pdffactory.com
ifstream in;
in.open(name, ios::binary);
if(!in){cout<<"файл для чтения "<<name<<" не открыт"<<endl; return 1;} in.read((char* ) &t,sizeof t); cout<<setw(26)<<"Name|"<<setw(9)<<"Vozrast|"<<setw(9)<<"Stepen|"<<setw(7)
<<"Stag|"<<endl;
for(int i=0;i<10;i++)
{
cout<<setw(51)<<"__________________________________"<<endl; cout<<setw(25)<<t[i].name<<"|"<<setw(8)<<t[i].years<<"|"<<setw(8)<< t[i].step<<"|"<<setw(6)<<t[i].stag<<"|";
cout<<endl;
}
in.close();
Обратите внимание, что в out.write((char* ) &t,sizeof t);и в in.read((char* ) &t,sizeof t); были выполнены операции приведения типа (char* ) &t , поскольку первый пара-
метр в функциях read и write представляет собой указатель на символьный массив. Оператор sizeof вы- числяет размер переменной, следующей за ним. В данном случае размер массива t.
Рассмотрим пример, когда имеется бинарный файл, каждый компонент которого является структурой
Tutors. Тогда чтение данных из бинарного файла с последующим выводом на экран имеет следующий вид:
ifstream in;
in.open(name, ios::binary);
if(!in){cout<<"файл для чтения "<<name<<" не открыт"<<endl; return 1;} cout<<setw(26)<<"Name|"<<setw(9)<<"Vozrast|"<< setw(9)<<
"Stepen|"<<setw(7) <<"Stag|"<<endl;
Tutors a; |
// пока не конец файла |
while(!in.eof()) |
|
{ |
|
in.read((char* ) &a,sizeof a); /* читать из файла */ cout<<setw(51)<<"__________________________________"<<endl;
cout<<setw(25)<<a.name<<"|"<<setw(8)<<a.years<<"|" <<setw(8)<< a.step<<"|"<<setw(6)<<a.stag<<"|";
cout<<endl;
}
in.close();
Вотличие от предыдущего фрагмента программы в данной части описана переменная a типа Tutors, и пока не будет достигнут конец файла, в переменную a считываются данные из бинарного файла и выводятся на экран.
Произвольный доступ к компонентам файла. Произвольный доступ можно организовать только для бинарных файлов. Произвольный доступ к компонентам файла можно выполнить с помощью функций seekg() и seekp().
ВС++ имеется два типа указателей файлов: get и put. Указатель get указывает на позицию файла при вводе данных, а put – на позицию при выводе данных.
Прототипы функций:
istrean &seekg( off_type offset, seekdir origin); istrean &seekp( off_type offset, origin);
off_type − это целочисленный тип, позволяющий хранить самое большое значение, которое может при- нимать параметр offset. Тип seekdir – это перечисление, принимающее следующие значения:
ios::beg |
− |
начало файла; |
ios::cur |
− |
текущая позиция; |
ios::end |
− |
конец файла. |
24
PDF created with pdfFactory Pro trial version www.pdffactory.com
Функция seekg() перемещает текущий get-указатель на offset байт относительно позиции, заданной ori-
gin.
Функция seekp() перемещает текущий put-указатель на offset байт относительно позиции, заданной ori-
gin.
Пример использования функций . seekg и seekp: fstream file; // описание файлового потока
file.open(name,ios::binary | ios::out |ios::in); int i,j;
char b,c; file.seekg(i); file.get(b); file.seekp(i); file.put(c); file.seekp(j); file.put(b);
Пример программирования. Информация о преподавателях хранится в текстовом файле. На основе имеющейся информации в текстовом файле создать бинарный файл, компоненты которого представляют собой структуру данных. Вывести на экран сведения о преподавателях в алфавитном порядке, а также спи- сок преподавателей от с до d лет и список преподавателей, чей стаж работы больше k лет.
Содержимое исходного текстового файла data.txt:
Текст программы:
#include <iostream> #include <fstream> #include <iomanip> #include <string> #include <clocale> using namespace std;
//структура «Преподаватели» struct Tutors
{
char name[25]; int years; char step[10]; int stag;
};
//функция вывода на экран содержимого файла void outfile(fstream& f, int n)
{
Tutors a;
f.seekg(0);/* установить указатель файла на начало */ cout<<setw(26)<<"Имя|"<<setw(9)<<"Возраст|"<<
setw(9)<<"Степень|"<<setw(7)<<"Стаж|"<<endl;
25
PDF created with pdfFactory Pro trial version www.pdffactory.com
cout<<setw(51)<<"__________________________________________"<<endl; for(int i=0; i<n; i++)
{
// чтение из файла
f.read((char *)&a,sizeof a);
cout<<setw(25)<<a.name<<"|"<<setw(8)<<a.years <<"|"<<setw(8)<<a.step<<"|"<<setw(6)<<a.stag<<"|";
cout<<endl;
}
}
/* функция чтения данных из текстового файла и запись данных в бинарный файл */
int read_f(fstream &f, fstream &out)
{
int i=0;Tutors a;
while(!f.eof())// пока не конец файла
{
f>>a.name>>a.years;f>>a.step;f>>a.stag; out.write((char *) &a, sizeof a);
i++;
}
return i;
}
/* функция сортировки компонентов бинарного файла в алфавитном порядке */ void sort(fstream &f,int n)
{
Tutors min,a; int n_min;
for(int i=0;i<n;i++)
{
f.seekg(i*(sizeof a)); f.read((char *)&min,sizeof min); n_min=i;
for(int j=i+1;j<n;j++)
{
f.read((char *)&a,sizeof a); if(strcmp(a.name,min.name)<0)
{
min=a; n_min=j;
}
}
f.seekg(i*(sizeof a)); f.read((char *) &a,sizeof a); f.seekp(i*(sizeof a)); f.write((char *) &min,sizeof min); f.seekp(n_min*(sizeof a)); f.write((char *) &a,sizeof a);
}
}
/* функция формирования нового файла из данных, попадающих в заданный интервал */
int IsYears(fstream &f,fstream &f_new,int n,int c, int d)
{
int k=0; Tutors a;
f.seekg(0);f_new.seekp(0); for(int i=0;i<n;i++)
{
f.read((char *) &a,sizeof a);
26
PDF created with pdfFactory Pro trial version www.pdffactory.com
if(a.years>=c && a.years<=d)
{
k++;
f_new.write((char *) &a, sizeof a);
}
}
return k;
}
/* функция формирования нового файла из данных, в которых стаж больше с */ int IsStag(fstream &f,fstream &f_new,int n,int c)
{
int k=0; Tutors a;
f.seekg(0);f_new.seekp(0); for(int i=0;i<n;i++)
{
f.read((char *) &a, sizeof a); if(a.stag>=c )
{
k++;
f_new.write((char *) &a,sizeof a);
}
}
return k;
}
int main()
{
setlocale(LC_CTYPE,"Russian"); fstream in ("data.txt", ios::in); if(!in)
{
cout<<"не открыт data.txt"<<endl; return 1;
}
fstream out ("data.dat", ios::out | ios::binary); if(!out)
{
cout<<"не открыт data.dat"<<endl; return 1;
}
int size_f=read_f(in,out); in.close();out.close();
fstream out_f ("data.dat", ios::in | ios::out | ios::binary); if(!out_f)
{
cout<<"не открыт data.dat"<<endl; return 1;
}
sort(out_f,size_f); outfile(out_f,size_f);
fstream out_f1 ("d.dat", ios::in | ios::out | ios::binary); if(!out_f1)
{
cout<<"не открыт data1.dat"<<endl; return 1;
}
cout<<"Введите через пробел возрастной интервал >"; int c,d;
cin>>c; cin>>d; outfile(out_f1,IsYears(out_f,out_f1,size_f,c,d)); cout<<"Введите стаж>";
cin>>c; outfile(out_f1,IsStag(out_f,out_f1,size_f,c));
27
PDF created with pdfFactory Pro trial version www.pdffactory.com
out_f.close();out_f1.close(); return 0;
}
Результат выполнения программы:
Порядок выполнения работы
1.Разработать и выполнить программу в соответствии со своим вариантом задания.
2.Результаты выполнения программы занести в отчет по работе.
3.Показать результаты работы преподавателю.
Требования к отчету
Отчет должен содержать:
1)наименование лабораторной работы;
2)краткие теоретические сведения;
3)схемы алгоритмов;
4)текст программы для своего варианта задания.
28
PDF created with pdfFactory Pro trial version www.pdffactory.com
Варианты заданий
Написать программу в соответствии с номером варианта. Номер варианта задания соответствует номе- ру компьютера в зале ВЦ, за которым выполняется лабораторная работа.
№ |
Задание |
1Создайте текстовый файл, содержащий сведения о сотрудни- ках института: фамилия работающего, название отдела, год рождения, стаж работы, должность, оклад. Напишите про- грамму, которая формирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстового файла. Отсортируйте данные бинарного файла в порядке возрастания года рождения. Выведите на экран ин- формацию о сотрудниках, чей оклад не превышает Х.
2Создайте текстовый файл, содержащий сведения о пациентах глазной клиники: фамилия пациента, пол, возраст, место про- живания (город), диагноз. Напишите программу, которая фор- мирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстового файла.
Отсортируйте данные бинарного файла в алфавитном порядке фамилий пациентов. Выведите на экран информацию об ино- городних пациентах с диагнозом J.
3Создайте текстовый файл, содержащий сведения об ассорти- менте игрушек в магазине: название игрушки, артикул, цена, страна производитель, для кого предназначена игрушка (маль- чикам или девочкам или тем и другим). Напишите программу, которая формирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстово- го файла. Отсортируйте данные бинарного файла в порядке
убывания цены и выведите на экран информацию об игрушках для категории X и страны производителя Y.
4Создайте текстовый файл, содержащий сведения об отправле- нии поездов дальнего следования с Казанского вокзала: номер поезда, станция назначения, время отправления, время в пути, наличие билетов. Напишите программу, которая формирует двоичный файл, каждый элемент которого является структу- рой, составленной на основе данных текстового файла. Отсор-
тируйте данные бинарного файла в порядке убывания времени в пути. Выведите на экран информацию о поездах, отправ- ляющихся после X часов.
5Создайте текстовый файл, содержащий сведения о том, какие
из пяти предлагаемых дисциплин по выбору желает изучать студент: фамилия студента, факультет, номер группы, пять дисциплин, средний балл успеваемости. Выбираемая дисцип- лина отмечается символом 1, иначе − 0. Напишите программу, которая формирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстово- го файла. Отсортируйте данные бинарного файла в порядке убывания среднего балла. Выведите на экран дисциплину, которую не желает изучать большинство студентов.
6Создайте текстовый файл, содержащий сведения о теннисистах чемпионата: фамилия спортсмена, число выигранных матчей, количество двойных подач, количество подач на вылет. Напи- шите программу, которая формирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстового файла. Отсортируйте данные бинарного файла в порядке убывания подач на вылет. Выведите на экран информацию о спортсменах, количество выигранных матчей у которых не менее X.
29
PDF created with pdfFactory Pro trial version www.pdffactory.com
Продолжение
№ |
Задание |
7Создайте текстовый файл, содержащий сведения о сдаче сту- дентами сессии: факультет, номер группы, фамилия студента, оценки по пяти экзаменам. Напишите программу, которая формирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстового файла.
Отсортируйте данные бинарного файла в алфавитном порядке факультетов и выведите на экран информацию о неуспеваю- щих студентах факультета X.
8Создайте текстовый файл, содержащий сведения об ассорти- менте обуви в магазине фирмы: артикул, наименование, коли- чество, стоимость одной пары. Артикул начинается с буквы Д − для дамской обуви, М − для мужской, П − для детской. Напишите программу, которая формирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстового файла. Отсортируйте данные би- нарного файла в алфавитном порядке наименований. Выведите на экран информацию об обуви, стоимость которой находится в диапазоне от A до B.
9Создайте текстовый файл, содержащий сведения о личной коллекции книголюба: шифр книги, автор, название, год изда- ния, местоположение (номер стеллажа). Напишите программу, которая формирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстово- го файла. Отсортируйте данные бинарного файла в алфавитном
порядке названий книг и выведите на экран информацию о книгах, изданных после XX года.
10Создайте текстовый файл, содержащий сведения о телефонах абонентов: фамилия абонентов, год установки телефона. На- пишите программу, которая формирует двоичный файл, каж- дый элемент которого является структурой, составленной на основе данных текстового файла. Отсортируйте данные бинар- ного файла по возрастанию годов установки телефонов и опре- делите количество установленных телефонов с XXXX года. Номер года вводится с клавиатуры.
11Создайте текстовый файл, содержащий информацию о рейсах аэропорта (номер рейса, тип самолета, пункт отправления, пункт назначения, время отправления, время прилета). Напи- шите программу, которая формирует двоичный файл, каждый элемент которого является структурой, составленной на основе данных текстового файла. Отсортируйте данные бинарного файла в алфавитном порядке названий пунктов назначений. Выведите на экран все рейсы, время отправления которых позже времени А, введенного с клавиатуры.
12Создайте текстовый файл, содержащий сведения о клиентах фирмы: наименование организации, дата основания, количест- во договоров на приобретение товаров, общая стоимость дого- воров. Напишите программу, которая формирует двоичный файл, каждый элемент которого является структурой, состав- ленной на основе данных текстового файла. Отсортируйте
данные бинарного файла в порядке увеличения количества договоров. Выведите на экран информацию о фирмах, общая стоимость договоров находится в интервале от А до С.
13Создайте текстовый файл, содержащий сведения о клиентах турагентства: фамилия клиента, страна турпоездки, год поезд- ки, стоимость тура. Напишите программу, которая формирует двоичный файл, каждый элемент которого является структу- рой, составленной на основе данных текстового файла. Отсор- тируйте данные бинарного файла в порядке убывания года. Выведите на экран информацию о клиентах, чей тур не пре- восходил стоимость Y.
30
PDF created with pdfFactory Pro trial version www.pdffactory.com