Ф едеральное агенство воздушного транспорта (росавиация)
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)
Кафедра вычислительных машин, комплексов, систем и сетей.
Лабораторная работа защищена с оценкой ____________________
____________________
(подпись преподавателя, дата)
ЛАБОРАТОРНАЯ РАБОТА №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; } |
Результат работы программы:
