#include <conio.h>
#include <stdlib.h>
#include <iomanip.h>
//Шаблон сортировки массива методом бинарной вставки
template <class TP>
void sort(TP a[], int n)
{
//Объявление переменных
int left, right, middle, i, j;
TP newElement;
for (i=1;i<n;i++)
{
//Обрабатываемый на данном этапе элемент
newElement=a[i];
//Границы отсортированной части массива
left=0; right=i-1;
while (left<=right)
{
//Средний элемент в отсортированной части
middle=(left+right)/2;
//Анализ отношения обрабатываемого и среднего элемента
if (a[middle]<=newElement)
left=middle+1;
else
right=middle-1;
}
//Сдвиг элементов вправо и вставка обрабатываемого элемента
//на новое место
for (j=i;j>right+1;j--) a[j]=a[j-1];
a[right+1]=newElement;
}
}
//Заполение массива, в зависимости от типа элементов
//(перегруженная функция)
void fill(int a[], int n)
{
randomize();
int i;
for (i=0;i<n;i++)
a[i]=rand()%1000;
}
void fill(float a[], int n)
{
randomize();
int i;
for (i=0;i<n;i++)
a[i]=(rand()%1000)/100.0;
}
void fill(char a[], int n)
{
randomize();
int i;
for (i=0;i<n;i++)
a[i]=rand()%200+56;
}
//Вывод массива на экран в зависимости от типа
//(перегруженная функция)
void print(int a[], int n)
{
int i;
for (i=0;i<n;i++)
cout<<setw(6)<<a[i];
cout<<endl<<endl;
}
void print(float a[], int n)
{
int i;
for (i=0;i<n;i++)
cout<<setprecision(2)<<setw(6)<<a[i];
cout<<endl<<endl;
}
void print(char a[], int n)
{
int i;
for (i=0;i<n;i++)
cout<<setw(6)<<a[i];
cout<<endl<<endl;
}
//Основная программа
void main(void)
{
//Объявление переменных
float a[100]; int b[100]; char c[100]; int n;
//Ввод числа элементов массивов
cout<<"Number of elements (from 1 to 100) >"; cin>>n;
cout<<endl;
//Заполнение массивов
fill(a,n); fill(b,n); fill(c,n);
//Вывод неотсортированных массивов на экран
print(a,n); print(b,n); print(c,n);
cout<<endl<<endl;
//Вызов функции сортировки массива
sort(a,n); sort(b,n); sort(c,n);
//Вывод отсортированных массивов на экран
print(a,n); print(b,n); print(c,n);
//Задержка
getch();
}
Тестовый пример:
Number of elements (from 1 to 100) >10
2 8.4 8.9 7.4 9.7 8.7 9.4 2.7 5.8 4.3
197 836 885 736 966 867 943 266 577 431
э \ Ќ А Ю { З z й W
2 2.7 4.3 5.8 7.4 8.4 8.7 8.9 9.4 9.7
197 266 431 577 736 836 867 885 943 966
Ќ А З Ю й э W \ z {
Лабораторная работа №11
Тема: Файловый ввод – вывод в С++
Постановка задачи.
Разработать программу, выполняющую следующие функции:
· поэкранный вывод текстового файла
· преобразование текстового файла в двоичный файл
· вывод двоичного файла
· выполнение дополнительной операции с двоичным файлом
Для работы с файлами использовать библиотеку классов потокового ввода – вывода fstream.h.Текстовый файл создать с помощью любого текстового редактора, записав в каждую строку файла информацию об одном экземпляре объекта. Варианты заданий приведены в табл.11
Таблица 11
Варианты заданий
№ | Объект | Дополнительная операция с двоичным файлом |
1 | ФИО, номер подразделения, зарплата | Добавление информации о работнике в конец файла |
2 | Табельный номер, ФИО, номер подразделения | Удаление записи о работнике с заданным табельным номером |
3 | Наименование товара, цена, количество | Поиск товара с заданным наименованием |
4 | Телефон, ФИО, адрес | Изменение информации о владельце данного телефона |
5 | Шифр студента, ФИО, группа | Подсчет количества студентов в заданной группе |
6 | Шифр студента, ФИО, средний балл | Удаление записей о студентах, со средним баллом<3 |
7 | Табельный номер, ФИО, кафедра | Изменение кафедры у работника с заданным табельным номером |
8 | Наименование товара, цена, количество | Добавление информации о товаре в конец файла |
9 | Шифр студента, год поступления. специальность | Запись информации о студентах с заданной специальностью в новый файл |
10 | Шифр студента, четыре оценки | Формирование нового файла, каждая запись которого содержит шифр студента и средний балл |
11 | ФИО, год рождения, пол | Копирование файла в другой файл |
12 | Номер заказа, ФИО и телефон заказчика | Поиск номеров заказа данного заказчика |
13 | Шифр группы, средний балл | Поиск лучшей группы |
14 | Номер заказа, цена заказа, заказчик | Добавление нового заказа |
15 | Автор, название и год издания книги | Удаление книги с заданным названием и заданного автора |
16 | Номер задания, имя задания, количество страниц | Формирование нового файла, из заданий с числом страниц, большим заданного |
17 | Код работника, профессия, опыт работы | Изменение опыта работы у работника с заданным кодом на новое значение |
18 | Код детали, наименование детали | Добавление новой детали |
19 | Табельный номер, должность, подразделение | Подсчет работников из заданного подразделения |
20 | Авторы, название, специальность для учебного пособия | Копирование файла в другой файл |
Методические указания
В С++ для работы с файлами определены три класса потоков:
ifstream | Файловый поток ввода (чтения) данных из файла |
ofstream | Файловый поток вывода (записи) данных в файл |
fstream | Файловый поток ввода и вывода данных |
Объявления этих классов находятся в заголовочном файле <fstream.h>.
Основные компонентные функции классов-потоков приведены в табл. 12.
Таблица 12
Компонентные функции классов-потоков
Функция | Описание функции |
void open(«Внешнее имя файла»[, режим]) | Открывает файл |
ostream& write(const signed char*, int n) | Выводит в выходной поток n символов из массива, на который указывает первый параметр |
istream& read (const signed char*, int n) | Читает из входного потока n символов в массив, на который указывает первый параметр |
int eof(void) | Тестирует конец файла (1- конец файла) |
void close(void) | Закрывает поток (файл) |
ostream& seekp (смещение, точка отсчета) | Смещает указатель записи выходного потока на заданное число байтов от точки отсчета (0-начало, 1-текщая позиция, 2-конец потока) |
istream& seekg (смещение, точка отсчета) | Смещает указатель записи входного потока на заданное число байтов от точки отсчета (0-начало, 1-текщая позиция, 2-конец потока) |
long tellg() | Возвращает текущую позицию указателя чтения входного потока |
long tellp() | Возвращает текущую позицию указателя записи выходного потока |
Значения параметра «режим» функции открытия файла приведены в табл. 13.
Таблица 13
Режимы открытия файла
Значение параметра «режим» | Описание параметра |
ios::in | Задает режим открытия файла для ввода |
ios::out | Задает режим открытия файла для вывода |
ios::ate | Задает режим открытия файла для добавления в конец файла |
ios::app | Задает режим открытия файла для добавления в конец файла |
ios::trunc | Удаляет содержимое файла |
ios::binary | Задает режим открытия файла в двоичном режиме |
Для обмена данными с двоичными файлами используются компонентные функции read и write, а для работы с текстовыми файлами - перегруженные операции >> и <<. На рис. 18 приведена программа, которая создает текстовый файл и записывает в него данные. Пример программы чтения записи с заданным номером из двоичного файла приведен на рис. 19.
#include <conio.h>
#include <fstream.h>
#include <stdlib.h>
struct rab
{
long nom;
char fam[15];
char name[15];
int zar;
int nal;
};
void main(void)
{
rab r;
ofstream f; // выходной поток
char name[12]; // имя файла
cout<<"Введите имя файла";
cin>>name;
f.open(name); //открытие файла для записи
if(!f) //проверка выполнения операции открытия
{ cout<<"Ошибка"; getch(); exit(1); }
for(int i=1;i<=10;i++) //цикл ввода данных и записи в файл
{cout<<"? "; cin>>r.nom>>r.fam>>r.name>>r.zar>>r.nal;
f<<r.nom<<" "<<r.fam<<" "<<r.name<<" "<<r.zar<<" "<<r.nal <<endl;}
f.close();
}
Рис. 18. Создание текстового файла
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
struct rab
{
long nom;
char fam[15];
char name[15];
int zar;
int nal;
};
void main(void)
{
rab r;
int n;
ifstream f; //входной поток
f.open("d:\user\b.dat",ios::binary| ios::in);
if(!f)
{ cout<<"Ошибка"; getch(); exit(1);}