Задача с книги Павловской, на тему Функции и Файлы (вариант 7)

О задаче:
[свернуть]

По книге:C/C++ Программирование на языке высокого уровня: Учебник для вузов 
Автор книги: Павловская Татьяна Александровна
Задача на тему: Функции и Файлы — (на странице 151)
Вариант задачи: 7 — (на странице 153)’ style=’default’ collapse_link=’true’]

Условия задачи:
[свернуть]

Для хранения данных о планшетных сканерах описать структуру вида: 


struct scan_info {
char model[25]: // наименование подели
int price; // цена
double x_size; // горизонтальный размер области сканирования
double y_size; // вертикальный размер области сканирования
int optr; // оптическое разрешение
int grey: // число градаций серого
};

Написать функцию, которая записывает в бинарный файл данные о сканере из приведенной структуры. Структура файла: в первых двух байтах размещается значение типа int, определяющее количество сделанных в файл записей; далее без пропусков размешаются записи о сканерах. Написать функцию, которая вводит данные о сканере с клавиатуры в структуру типа scan_info, и если данные об этом сканере отсутствуют в файле, помещает содержимое структуры в конец файла; в противном случае выдает соответствующее сообщение. Привести пример программы, создающей файл с данными о сканерах (данные вводятся из текстового файла) – 6-8 записей и дополняющей файл записями о 2-3 сканерах, вводимых с клавиатуры. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.’ style=’default’ collapse_link=’true’]

Листинг(исходник) программы:
[свернуть]


Function.h
[свернуть]


void Func_ReadTxtFile(scan_info *SCANERS, const int Num);
void Func_WriteBinFile(scan_info *SCANERS, const int Num);
void Func_AddStructBinFile(scan_info *SCANERS, const int AddNum);

‘ style=’default’ collapse_link=’true’]

Struct.cpp
[свернуть]


#pragma once
struct scan_info
{
char model[25];
int price;
double x_size;
double y_size;
int optr;
int grey;
};

‘ style=’default’ collapse_link=’true’]

main.cpp
[свернуть]


#include <iostream>
#include <locale>
#include "Struct.cpp"
#include "Function.h"
using namespace std;

int main(){
setlocale(LC_ALL,"Rus");
/*------------------------------------------Создание динамического массива структуры--------------------------------------------------*/
int Num;
NumbStruct: system("cls"); cout << "Сколько структур вы хотите добавить из файла? ";
cin>>Num; //Запрос на число добавления скольки структур необходимо сделать
if(Num <=0)
{
cout<<"Нельзя создать количество структур равное "<<Num<<" !!!\\nВведите пожалуйста корректное количество желаемого числа структур\\n";
system("pause");
goto NumbStruct;
}
system("cls");

scan_info *SCANERS = new scan_info [Num]; // Создание динамического массива структур количества Num

/*----Вызовы функций заполнения массива структур из файла и записи в бинарный файл массива структур из хранящихся в памяти структур----*/
Func_ReadTxtFile(SCANERS, Num); // Вызов функции заполнения массива структур из файла
Func_WriteBinFile(SCANERS, Num); // Вызов функции записи в бинарный файл массива структур из хранящихся в памяти структур
delete [] SCANERS; // Освобождение памяти массива структур SCANERS
/*-----------------------------Запрос на добавление еще нескольких сканеров структуры scan_info--------------------------------------*/
cout << "Хотите добавить в файл еще несколько сканеров с клавиатуры? \\\'y\\\' \\\\ \\\'n\\\' : "; char answer;int AddNum; cin>> answer;
if(answer == \'y\') //Запрос на число добавления скольки структур необходимо сделать
{
AddNumbStruct: system("cls"); cout<<"Какое количество сканеров хотите добавить? ";cin>>AddNum;
if(AddNum <=0)
{
cout<<"Нельзя создать количество структур равное "<<AddNum<<" !!!\\nВведите пожалуйста корректное количество желаемого числа структур\\n";
system("pause");
goto AddNumbStruct;
}
}
else if(answer == \'n\') return 0;
else return 0;
system("cls");

scan_info *ADD_SCANERS = new scan_info [AddNum]; // Создание динамического массива структур количества AddNum
/*----Вызовы функций заполнения массива структур из файла и записи в бинарный файл массива структур из хранящихся в памяти структур----*/
Func_AddStructBinFile(ADD_SCANERS, AddNum);	 // Вызов функции добавления структур с клавиатуру в бинарный файл
delete [] ADD_SCANERS; // Освобождение памяти массива структур ADD_SCANERS
/*-----------------------------------------------------Конец программы---------------------------------------------------------------*/
system("pause");
return 0;
}

‘ style=’default’ collapse_link=’true’]

Func_Files.cpp
[свернуть]


#pragma once
#include <fstream>
#include <iostream>
#include <locale>
#include "Struct.cpp"
using namespace std;
void Func_ReadTxtFile(scan_info *SCANERS, const int Num)
{
ifstream fin("File_Struct.txt"); // Связываем файл с потоком вывода в файл
if(!fin)
{
cout << "Файл не найден" << endl;// Проверка файла на существование
}
else
{
for(int i=0; i< Num; i++)
{
fin >> SCANERS[i].model >> SCANERS[i].price >> SCANERS[i].x_size>> //Заполнение структуры с файла
SCANERS[i].y_size >> SCANERS[i].optr >> SCANERS[i].grey;
}
}
fin.close();
}

void Func_WriteBinFile(scan_info *SCANERS, const int Num)
{
ofstream fout("OutFile.bin", ios_base::binary); // Связываем поток ввода с файлом
for(int i = 0; i < Num; i++)
{
short j = i+1;
fout.seekp(0,ios_base::beg);
fout.write((char *)&j,sizeof(j));
fout.seekp(0,ios::end);
fout.write((char *)&SCANERS[i],sizeof(scan_info));
}
fout.close();
}

void Func_AddStructBinFile(scan_info *ADD_SCANERS, const int AddNum)
{
/*----------------Заполнения массива структуры scan_info-----------------------------------*/
for( int i = 0; i < AddNum; i++ )
{
cout<<"\\tВведите наименование модели: "; cin>>ADD_SCANERS[i].model;
cout<<"\\n\\tВведите цену: "; cin>>ADD_SCANERS[i].price;
cout<<"\\n\\tВведите горизонтальный размер области сканирования: "; cin>>ADD_SCANERS[i].x_size;
cout<<"\\n\\tВведите вертикальный размер области сканирования: "; cin>>ADD_SCANERS[i].y_size;
cout<<"\\n\\tВведите оптическое разрешение: "; cin>>ADD_SCANERS[i].optr;
cout<<"\\n\\tВведите число градаций серого: "; cin>>ADD_SCANERS[i].grey;
system("cls");
}

/*-------Проверка массива ADD_SCANERS на повторторение данных в бинарном файле, иначе запись о сканере не добавляется----*/
fstream ft("OutFile.bin", ios_base::binary|ios_base::in|ios_base::out);
short j;
ft.seekg(0);
ft.read((char *)&j,sizeof(j)); //Копируем значения счетчика файла, в котором занесено количество находящихся в файле сканеров
bool flag;
for(int i = 0; i < AddNum; i++) // Объявляем цикл, для проверки AddNum количества массивов структуры ADD_SCANERS
{
for( int k=0, l=0; !ft.eof(); l=l+4, k=14*l ) // Объявляем цикл, для проверки AddNum количества массивов структуры ADD_SCANERS
{
flag = false;
ft.seekg(k+2,ios_base::beg); // Переходим ко второму байту с начала файла
char buf[25]; // Буферная переменная для хранения значения считаемового с бинарного файла
ft.read(buf,25); // Заносим значение из файла в переменную buf
if(strcmp(buf,ADD_SCANERS[i].model) == 0)
{
flag = true;
break;
} 
}
if( !flag )
{
ofstream fout ("OutFile.bin", ios_base::binary|ios_base::app);
fout.write( (char *)(&ADD_SCANERS[i]), sizeof(scan_info));
cout<<"Cканер "<<ADD_SCANERS[i].model<<" добавлен в файл!!!\\n";
fout.close();
j+=1;
}
else cout<<"Cканер "<<ADD_SCANERS[i].model<<" уже существует в файле!!!\\n";
ft.clear();
}
ft.seekp(0,ios_base::beg);
ft.write((char *)&j,sizeof(j));
ft.close();
}

‘ style=’default’ collapse_link=’true’]

Автор: Павел Кадыров

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *