Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream> // Библиотека ввода-вывода.
- #include <fstream> // Библиотека файлового ввода-вывода.
- #include <string> // Библиотека для работы со строками.
- #include <iomanip> // Библиотека для использования манипуляторов ввода-вывода.
- #define FilePath "list.rtf" // Макроопределение: Путь к файлу со списком книг.
- using namespace std;
- struct Flat
- {
- int rooms; // Число комнат
- int total; // Общая площадь
- int living; // Жилая площадь
- int balcones; // Число балконов
- int floor; // Этаж
- int storeys; // Этажность дома
- string districs; // Район
- };
- // Вспомогательная функция для чтения int из отдельной строки текстового потока.
- int ReadInt(istream & stream)
- {
- int value;
- stream >> value;
- stream.ignore(256, '\n'); // Пропуск всех символов до перехода на новую строку.
- return value;
- }
- // Функция для чтения одной книги из потока.
- // Каждое поле должно располагаться в отдельной строке.
- Flat ReadFlat(istream & stream)
- {
- Flat flat;
- flat.rooms = ReadInt(stream);
- flat.total = ReadInt(stream);
- flat.living = ReadInt(stream);
- flat.balcones = ReadInt(stream);
- flat.floor = ReadInt(stream);
- flat.storeys = ReadInt(stream);
- getline(stream, flat.districs);
- return flat;
- }
- // Функция для чтения списка книг из потока.
- // (Амперсанд (&) перед именем аргумента обеспечивает передачу аргумента по ссылке,
- // то есть books и count могут быть изменены внутри функции так, что это будет видно в вызыващей функции.)
- bool ReadFlats(Flat * & flats, int & count, const string filepath)
- {
- bool read = false;
- ifstream file(filepath); // Открытие файла для чтения текста.
- // Чтобы включить поддержку string в конструкторе ifstream, нужно установить флаг:
- // Settings -> Compiler... -> Global compiler settings -> Compiler settings -> Compiler flags ->
- // Have g++ foloow the C++11 ISO C++ language standard [-std=c++11]
- if (file)
- { // Файл успешно открыт.
- count = ReadInt(file); // Чтение количества книг в файле.
- if (count > 0)
- {
- flats = new Flat[count]; // Выделение памяти для count книг.
- for (int i = 0; i < count; i++)
- flats[i] = ReadFlat(file);
- file.close(); // Закрытие файла.
- read = true; // Функция должна вернуть true при успешном чтении.
- }
- }
- return read; // Вернуть true, если файл прочитан, иначе - false.
- }
- // Функция для записи одной книги в файл.
- // Запись "const Book & book":
- // 1) Амперсанд (&) перед именем аргумента обеспечивает передачу параметра по ссылке.
- // Передача по ссылке не приводит к копированию структуры.
- // 2) "const" обеспечивает запрет на изменение book внутри функции.
- void WriteBook(ostream & file, const Flat & flat)
- {
- file
- << flat.rooms << endl
- << flat.total << endl
- << flat.living << endl
- << flat.balcones << endl
- << flat.floor << endl
- << flat.storeys << endl
- << flat.districs << endl;
- }
- // Функция для записи списка книг в файл.
- bool WriteBooks(Flat * flats, int count, const string filepath)
- {
- bool written = false;
- ofstream file(filepath); // Открытие файла для записи текста.
- if (file)
- { // Файл успешно открыт.
- file << count << endl; // Запись количества книг в файл.
- for (int i = 0; i < count; i++)
- WriteBook(file, flats[i]);
- file.close(); // Закрытие файла.
- written = true; // Функция должна вернуть true при успешном записи.
- }
- return written; // Вернуть true, если файл записан, иначе - false.
- }
- // Функция для вывода заголовка таблицы.
- void WriteTableHeader()
- {
- cout
- << left << setw(20) << "Число комнат"
- << left << setw(20) << "Общая площадь"
- << left << setw(20) << "Жилая площадь"
- << left << setw(20) << "Число балконов"
- << left << setw(8) << "Этаж"
- << left << setw(20) << "Этажность дома"
- << left << setw(8) << "Район"
- << endl;
- // Манипулятор left обеспечивает выравнивание по левому краю.
- // Манипулятор setw задаёт ширину вывода.
- // Строка кода
- // cout << left << setw(8) << "Title";
- // выводит
- // "Title "
- }
- // Функция для вывода книги в строчку таблицы.
- // (Ширина
- //вывода для каждого поля должна соответствовать функции WriteTableHeader.)
- void WriteBookToTable(const Flat & flat)
- {
- cout
- << left << setw(32) << flat.rooms
- << left << setw(20) << flat.total
- << left << setw(15) << flat.living
- << left << setw(5) << flat.balcones
- << left << setw(6) << flat.floor
- << left << setw(5) << flat.storeys
- << left << setw(6) << flat.districs
- << endl;
- }
- // Функция для вывода списка книг в виде таблицы/
- void WriteBooksToTable(const Flat * flats, int count)
- {
- WriteTableHeader(); // Вывод заголовка таблицы книг.
- for (int i = 0; i < count; i++)
- WriteBookToTable(flats[i]);
- }
- // Поиск наиболее новой книги (с наибольшим годом публикации).
- void FindNewest(const Flat * flats, int count)
- {
- int year = -1; // Переменная для хранения максимального найденного года.
- // Предполагаем, что отрицательного значения года публикации ни у одной книги нет.
- int index = -1; // Переменная для хранения индекса книги с максимальным годом.
- for (int i = 0; i < count; i++)
- if (flats[i].balcones > year)
- { // Год публикации книги превышает текущее значение максимального года.
- year = flats[i].balcones; // Сохраняем новое значение максимального года.
- index = i; // Сохраняем индекс книги с максимальным годом.
- }
- if (index != -1)
- { // Индекс был изменён, значит, новейшая книга найдена.
- cout << "The newest book:" << endl;
- WriteTableHeader();
- WriteBookToTable(flats[index]); // Используем сохранённый индекс для доступа к книге.
- }
- else
- // Первоначальное значение индекса говорит о том, что либо список кни пуст, либо года в списке меньше -1.
- cout << "Can't find the newest book." << endl;
- }
- int main()
- {
- Flat * flats; // Указатель на массив книг. (Самого массива в данный момент нет.)
- int count; // Количество записей в массиве книг.
- bool read = ReadFlats(flats, count, FilePath); // Чтение книг из файла.
- if (read)
- { // Файл успешно прочитан.
- cout << "File " << FilePath << " was read." << endl;
- cout << "---— —-— —-— —---" << endl;
- WriteBooksToTable(flats, count); // Вывод таблицы книг.
- bool written = WriteBooks(flats, count, FilePath); // Запись книг в файл.
- if (written)
- cout << "File " << FilePath << " was written." << endl;
- else
- cout << "File " << FilePath << " wasn't written." << endl;
- cout << "---— —-— —-— —---" << endl;
- FindNewest(flats, count);
- delete[] flats; // Освобождение памяти.
- }
- else
- cout << "File " << FilePath << " wasn't read." << endl; // Файл не был прочитан.
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement