Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб.практикум_2

.pdf
Скачиваний:
27
Добавлен:
27.03.2016
Размер:
699.3 Кб
Скачать

14, 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]