Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы / лаба 12 прога.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
213.34 Кб
Скачать

Ф едеральное агенство воздушного транспорта (росавиация)

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)

Кафедра вычислительных машин, комплексов, систем и сетей.

Лабораторная работа защищена с оценкой ____________________

____________________

(подпись преподавателя, дата)

ЛАБОРАТОРНАЯ РАБОТА №12

по дисциплине «Программирование».

Вариант №17

Тема: «Обработка данных текстовых и бинарных файлов.»

Выполнила студентка группы ИС 1-1

Магальник Екатерина Борисовна

Руководитель: Белозуб Юлия Валерьевна

МОСКВА – 2023

1.1. Цель лабораторной работы

Целью лабораторной работы является получение навыков программирования с использованием текстовых и бинарных файлов, содержащих структурированные данные.

1.2. Задание на выполнение лабораторной работы

1) Разработать структуру программы, схемы алгоритмов и программу обработки данных бинарного файла. Файл должен содержать структурированные данные конкретного варианта лабораторной работы. Использовать данные варианта лабораторной работы № 7.

2) Программа должна включать следующие функции обработки данных:

- создание бинарного файла из текстового файла с данными;

- дополнение файла новыми записями;

- чтение данных бинарного файла;

- поиск структур бинарного файла, поиск производить:

1) по одному поисковому признаку;

2) по любому сочетанию заданных поисковых признаков;

- модификация ряда структур бинарного файла;

3) Главная функция должна производить вызов разработанных функций.

Данные файла sozd.txt:

Данные файла poisk1.txt:

Данные файла poisk2.txt:

Данные файла kor.txt:

Текст программы:

#include <iostream>

#include <fstream>

#include <iomanip>

#include <string>

using namespace std;

ofstream fout;

ifstream fin;

fstream io;

struct flat {

string adress;

int area;

string side;

int floor;

int rooms;

int value;

}st;

int z = sizeof(flat);

flat B[10];

char sh[6][256] = { " Flats ",

"|==========|=========|==========|=========|==========|==========|",

"|Adress |Area |Side |Floor |Rooms |Value |",

"|==========|=========|==========|=========|==========|==========|",

"|----------|---------|----------|---------|----------|----------|"

};

double s;

void p(), cht(), sozd(), dop(), zf(), poisk1(), poisk2(), kor(), psh();

void p() {

fout << "|" << setw(10) << st.adress << "|" << setw(9) << st.area << "|"

<< setw(10) << st.side << "|" << setw(9) << st.floor << "|" << setw(10) << st.rooms << "|" << setw(10) << st.value << "|\n";

}

void sozd() {

fout << "\n MAKING OF FILE \n";

fin.open("C:\\sozd.txt"); //открываем файл с исходными данными

if (!fin) {

cout << "Error. Can not open the file.";

system("pause");

return;

}

//создаем новый бинарный файл для записи:

io.open("binary.cpp", ios::out | ios::binary);

if (!io) {

cout << "Error. Can not open the binary file.";

system("pause");

return;

}

psh(); //вывод строк шапки таблицы в файл результатов

zf(); //вызов функции чтения данных и записи их в бинарный файл:

fin.close();

io.close();

}

void cht() {

int n = 0; //счетчик структур в бинарном файле

float value = 0;

fout << "\n READING OF FILE\n";

fin.open("binary.cpp", ios::in | ios::binary); //открытие бинарного файла для чтения

if (!fin) {

cout << "Error. Can not open the binary file.";

system("pause");

return;

}

psh(); // вывод строк шапки таблицы

while (fin.peek() != EOF) { //пока не достигли символа конца файла

fin.read((char*)&st, z); //считываем структуру в переменную st

p(); //выводим поля структуры в таблицу

value += st.value;

n++;

}

fout << sh[4] << endl << "Summary value = " << value << endl << "Everage value = " << value / n << endl << "Count of values in file = " << n << endl;

fin.close();

}

void zf() { //запись файла

char T[100];

while (!fin.eof()) {

fin >> st.adress;

fin >> st.area;

fin >> st.side;

fin >> st.floor;

fin >> st.rooms;

fin >> st.value;

fin.getline(T, 100);

io.write((char*)&st, z); // запись структуры целиком из ОП в бин. файл

p(); //запись полей структуры в строку таблицы файла результатов

}

fout << sh[4] << endl;

}

void poisk1() {

string side; //символьный массив для хранения поискового признака

ifstream fin("C:\\poisk1.txt");

//fin.open("C:\\poisk1.txt"); //открытие файла данных для поиска

if (!fin) {

cout << "Error. Can not open the searching file 1.";

system("pause");

return;

}

fout << "\n\n SEARCHING FOR A FLAT BY SIDE\n";

io.open("binary.cpp", ios::in | ios::binary); //открытие бин. ф. для чтения

if (!io) {

cout << "Error. Can not open the binary file.";

system("pause");

return;

}

while (fin.peek() != EOF) {

getline(fin, side);

fout << "\nSearching for a flat on side - " << "\"" << side << "\"" << endl;

if (side[0] == '\0') {

fout << "No side for searching.\n"; continue;

}

io.seekg(0, ios::beg); //указатель бин. файла устанавливается на начало

while (io.peek() != EOF) { //пока не достигнут символ конца файла

io.read((char*)&st, z); //читаем из файла одну структуру в st

if (st.side == side) //сравниваем поступившую сторону с тем, что есть в структуре

{

p();

goto m;

} //если совпадение выводим данные структуры

} //и управление передается на метку m

fout << "Flat on side " << side << " was not found." << endl;

m:;

}

fin.close();

io.close();

}

void poisk2() {

string adress;

int floor; //переменные для хранения поисковых признаков

ifstream fin("C:\\poisk2.txt", ios::in); // открытие файла данных для поиска

if (!fin) {

cout << "Error. Can not open the searching file 2.";

system("pause");

return;

}

fout << "\n\n SEARCHING FOR A FLAT BY ADRESS OR FLOOR\n";

while (fin.peek() != EOF) { //пока не достигнут символ конца файла

getline(fin, adress, ' ');

fin >> floor;

int k = 0;

fout << "\nSearching for a flat by - " << "\"" << adress << "\"" << " or higher than " << floor << " floor" << endl;

if (adress[0] == '\0' && floor == 0) {

fout << "There no adress and floor for searching\n"; continue;

}

io.open("binary.cpp", ios::in | ios::binary); //открытие бин. ф. для чтения

if (!io) {

cout << "Error. Can not open the binary file.";

system("pause");

return;

}

while (io.read((char*)&st, z)) //пока читаются данные из бинарного файла

if ((adress != st.adress || adress[0] == '\0') && (floor <= st.floor || floor == 0))

{

p(); k++;

} //если условие истинно, поля выводятся

//и счетчик выводимых структур увеличивается на 1

if (!k) fout << "There no flat found" << endl;

io.close();

}//конец тела цикла по файлу данных с поисковыми признаками

fin.close(); io.close();

}

void dop() {

fout << "\n\n FILLING THE FILE WITH NEW DATA \n" << endl;

fin.open("C:\\dop.txt", ios::in); // открытие файла данных для дополнения

if (!fin) {

cout << "Error. Can not open the file with additional data.";

system("pause");

return;

}

//открытие бинарного файла в режиме дополнения

io.open("binary.cpp", ios::app | ios::binary);

if (!io) {

cout << "Error. Can not open the binary file with additional data.";

system("pause");

return;

}

for (int i = 1; i < 5; i++)

fout << sh[i] << endl;

zf();

fin.close(); io.close();

}

void kor() {

char buf[80]; //массив - буфер

char adress[100]; //для хранения адреса – поисковый признак

int floor; //переменная для этажа

fout << "\n\n CORRECTING OF THE FILE\n\n";

fin.open("C:\\kor.txt", ios::in);

if (!fin) {

cout << "Error. Can not open the file for correcting.";

system("pause");

return;

}

while (fin.peek() != EOF) { //1 цикл ввода данных для коррекции

fin.get(adress, 100);

fin >> floor;

fin.getline(buf, 80);

int k = 0;

if (!strcmp(adress, ""))

{

fout << "\nNo adress for searching in structure\n";

continue;

}

//открытие бинарного файла в режиме чтения и записи

io.open("binary.cpp", ios::in | ios::out | ios::binary);

if (!io) {

cout << "Error. Can not open the binary file for correcting.";

system("pause");

return;

}

while (io.read((char*)&st, z)) // 2

if (st.adress != adress) { //если найдена структура

p();

st.floor = floor;

p(); //изменяем ее

io.seekp(-z, ios::cur); //смещаем указатель файла на одну структуру назад

io.write((char*)&st, z); //запись в файл откорректированной структуры

k++;

break;

}

if (!k) fout << "Flat with adress - " << adress << " was not found." << endl;

io.close();

}

fin.close();

io.close();

}

void psh() { //вывод шапки

for (int i = 0; i < 5; i++)

fout << sh[i] << endl;

}

#include "Header.h"

using namespace std;

int main() {

fout.open("lab12.txt");

if (!fout) cout << "Error. Can not open the file.";

sozd(); cht(); dop(); cht(); poisk1(); poisk2(); kor(); cht();

return 0;

}

Результат работы программы: