Практическое занятие № 7
ТЕМА: Создание программ по работе с файлами
ЦЕЛЬ РАБОТЫ: получить практические навыки по использованию файлов в программах на С++
Ход работы
1. Объект книга описывается свойствами: шифр, автор, название, цена. Составить программу, выполняющую следующие функции:
1.1. Выдать меню с режимами работы:
1 - создание файла
2 - добавление в файл
3 - книги с максимальной ценой
4 - книги указанного автора
5 - выход;
1.2. При выборе первого пункта создается файл BIBLIO.DAT и записывается в него информация об N книг;
1.3. При выборе второго пункта можно добавить в файл еще M книг;
1.4. При выборе пункта 3 на экран из файла выводятся названия книг с максимальной ценой;
1.5. При выборе пункта 4 программа подсчитывает количество книг указанного автора (автора ввести с клавиатуры);
Выполнение работы
//подключаем заголовочные файлы
#include <iostream.h>
#include
<iomanip.h>
#include
<fstream.h>
#include
<string.h>
#include
<stdio.h>
//описываем структуру
"книга"
struct book
{
int
shifr;
char autor[15], nazv[30];
float cena;
};
int main()
{
system("chcp 1251>nul");
//описываем переменную для работы
со структурой
book bk;
//описываем вспомогательные переменные
int i,n,k,b,kol;
float maxcena;
char autor[15];
//обнуляем признак завершения программы
b=0;
//пока b=0 будем повторять цикл выдачи меню
while (b==0)
{
//очищаем экран
system("cls");
//выдаем меню программы
cout<<"1
- создание файла\n";
cout<<"2
- просмотр файла\n";
cout<<"3
- добавление в файл\n";
cout<<"4
- книги с максимальной ценой\n";
cout<<"5
- книги указанного автора\n";
cout<<"6
- выход\n";
//запрашиваем выбор пользователя из меню
cout<<"Сделайте
выбор:"; cin>>k;
//обрабатываем выбранный пункт меню
switch (k)
{
//если выбран первый пункт меню
case 1:
{
//описываем переменную для записи в
файл
ofstream file1;
//связываем переменную с файлом на
диске и создаем файл
//открываем файл как бинарный (двоичный)
file1.open("biblio.dat",ios::binary);
//вводим количество книг
cout<<"Введите количество книг: ";
cin>>n;
//организуем цикл для ввода данных
for (i=0;i<=n-1;i++)
{
//вводим данные об i книге
cout<<i+1<<"-я книга:\n";
cout<<"-шифр: "; cin>>bk.shifr;
//очищаем ввод от клавиши Enter
cin.get();
cout<<"-автор: "; cin.getline(bk.autor,15);
cout<<"-название: "; cin.getline(bk.nazv,30);
cout<<"-цена: "; cin>>bk.cena;
//записываем i книгу в файл
file1.write((char*) &bk, sizeof bk);
}
//закрываем файл
file1.clear();
file1.close();
cout<<"Файл успешно создан!"<<endl;
//делаем паузу для просмотра
system("pause");
break;
}
//если выбран второй пункт меню
case 2:
{
//описываем переменную для чтения из
файла
ifstream file1;
//связываем переменную с файлом
biblio.dat
//открываем файл для чтения
file1.open("biblio.dat",ios::in);
cout<<"Данные из файла:\n";
//в цикле читаем данные из файла
while (file1.read((char*) &bk, sizeof bk))
{
//выводим шифр книги, отводим под шифр 10 позиций - setw(10)
//выравниваем текст по левому
краю (left)
//не переходим на новую строку
cout<<setw(10)<<left<<bk.shifr;
//выводим автора, отводим для него 15 позиций
cout<<setw(15)<<left<<bk.autor;
//выводим название книги, отводим 20 позиций
cout<<setw(20)<<left<<bk.nazv;
//выводим цену книги, отводим под нее 6 позиций
//выводим число с плавающей запятой (fixed)
//устанавливаем 2 знака после запятой (setprecision(2))
cout<<setw(6)<<left<<fixed<<setprecision(2)<<bk.shifr;
//переходим на новую строку
cout<<endl;
}
//закрываем файл
file1.clear();
file1.close();
//делаем паузу для просмотра
system("pause");
break;
}
//если выбран третий пункт меню
case 3:
{
//переменная file1 для добавления в
файл
ofstream file1;
//переменная file1 связывается с файлом
biblio.dat в режиме добавления
file1.open("biblio.dat",ios::app);
//вводим количество книг для добавления
cout<<"Введите количество книг: ";
cin>>n;
//в цикле вводим данные об i книге
for (i=0;i<=n-1;i++)
{
cout<<i+1<<"-я книга:\n";
cout<<"-шифр: "; cin>>bk.shifr;
//очищаем ввод от клавиши Enter
cin.get();
cout<<"-автор: "; cin.getline(bk.autor,15);
cout<<"-название: "; cin.getline(bk.nazv,30);
cout<<"-цена: "; cin>>bk.cena;
//записываем данные об i книге в file1
file1.write((char*) &bk, sizeof bk);
}
//закрываем файл
file1.clear();
file1.close();
cout<<"Данные успешно
добавлены!"<<endl;
//делаем паузу для просмотра
system("pause");
break;
}
//если выбран четвертый пункт меню
case 4:
{
//предполагаем, что максимальная цена
равна 0
maxcena=0;
//описываем переменную для чтения из
файла
ifstream file1;
//связываем переменную file1 с файлом
biblio.dat
//открываем файл для чтения
file1.open("biblio.dat",ios::in);
//в цикле читаем данные из фала file1
//и находим максимальную цену
while (file1.read((char*)
&bk, sizeof bk))
if (bk.cena>maxcena)
maxcena=bk.cena;
//выводим максимальную цену на экран
cout<<"Максимальная цена="<<maxcena<<"\n";
cout<<"Список книг с максимальной ценой:\n";
//разблокируем файл file1
file1.clear();
//переходим на начало файла
file1.seekg(0);
//в цикле читаем данные из фала file1
while (file1.read((char*) &bk, sizeof bk))
//если цена равна максимальному значению
if (bk.cena==maxcena)
//выводим на экран название
этой книги
cout<<bk.nazv<<"\n";
//закрываем файл
file1.clear();
file1.close();
//делаем паузу для просмотра
system("pause");
break;
}
//если выбран пятый пункт меню
case 5:
{
cin.get();
//вводим автора для поиска
cout<<"Введите автора для поиска: ";
cin.getline(autor,15);
//описываем переменную для чтения из
файла
ifstream file1;
//связываем переменную с файлом
biblio.dat
//открываем файл для чтения
file1.open("biblio.dat",ios::in);
//предполагаем, что количество равно
0
kol=0;
//в цикле читаем данные из файла
while (file1.read((char*) &bk, sizeof bk))
//если начальные символы автора книги воспадают с введенным автором
if (strnicmp(bk.autor,autor,strlen(autor))==0)
//количество увеличивается на 1
kol++;
//выводим количество книг на экран
cout<<"Количество книг указанного автора равно
"<<kol<<"\n";
//закрываем файл
file1.clear();
file1.close();
//делаем паузу для просмотра
system("pause");
break;
}
//если выбран шестой пункт меню
case 6:
{
//признак выхода из цикла программы
равен 1
b=1;
break;
}
} //конец switch
} //конец while
return 0;
}
Решить самостоятельно:
Задача 1.
Имеются данные о товарах: номер товара, название, количество, цена за единицу и вычисляемое поле стоимость=количество*цена за единицу.
Составить программу, выполняющую следующие функции:
1.1. Выдать меню с режимами работы:
1 - создание файла
2 - добавление в файл
3 – задание 1
4 – задание 2
5 – задание 3
6 – задание 4
7 - выход;
1.2. При выборе первого пункта создается файл TOVARI.DAT и записывается в него информация об N товарах;
1.3. При выборе второго пункта можно добавить в файл еще M товаров;
1.4. При выборе пункта 3 на экран из файла выводится по заданной части названия товара информация о товаре;
1.5. При выборе пункта 4 программа подсчитывает суммарную стоимость всех товаров;
1.6. При выборе пункта 5 программа подсчитывает максимальное количество товаров заданного наименования;
1.7. При выборе пункта 6 программа вывести товары с наименьшим количеством.
При выполнении пунктов 3, 4, 5, 6
обязательно вывести все данные из файла, а затем результаты – с поясняющим
текстом.