Тема: Класи
Доброго дня.. Почала вивчати С++ і стикнулась з проблемою, мабуть, зчитування з файлу. Проєкт реалізовано багатофайловим. Спробую якось пояснити по частинах.
Завдання наступне:
Тільки файл не бінарний, а текстовий.
Головний виконавчий файл:
#include "pch.h"
#include "listHouses.h"
#include "houses.h"
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Houses h;
HousesList hl;
ifstream f ("F:\\ООП\\лабораторні\\streets.txt");
if (f.is_open()==0)
cout << "Файл не відкрито!\n\n" << endl;
for (f >> h; !f.eof(); f >> h) //тут напочатку зчитую дані
cout << h;
system("cls");
h.menu(); //перехід в меню
f.close();
return 0;
}
Тут в хедері оголошую клас і методи
#pragma once
#include <vector>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include "Windows.h"
using namespace std;
class Houses //Оголошення класу "Будинки"
{
private:
string street; // вулиця
int number_house; //номер будинку
int kol_meshk; //к-сть жителів
int year_construct; //рік побудови
string date; //дата постановки на облік
string repair; //наявність ремонту за останні 20 років
public:
//Порожній конструктор
Houses();
// конструктор з параметрами
Houses(string, int, int, int, string, string);
string getStreet(); // метод передачі значення у поле назви вулиці
void setStreet(string); // метод повернення значення назви вулиці
int getHouseNumber(); // метод передачі значення у поле номера будинку
void setHouseNumber(int); // метод повернення значення
int getKolMeshk(); // метод передачі значення у поле кількості мешканців
void setKolMeshk(int); // метод повернення значення
int getYearConstruct(); // метод передачі значення у поле року побудови
void setYearConstruct(int); // метод повернення значення
string getDate(); // метод передачі значення у поле дати постановки на облік
void setDate(string); // метод повернення значення
string getRepair(); // метод передачі значення у поле наявності ремонту
void setRepair(string); // метод повернення значення наявності ремонту
//дружні методи вводу виводу даних
friend ostream& operator << (ostream&, Houses&);
friend istream& operator >> (istream&, Houses&);
void line(int n);
void linee(int n);
void line1(int n);
void line2(int n);
void line3(int n);
void menu();
void shapka();
static struct HousesComparator //статичний метод сортування за зростанням
{
bool operator ()(const Houses& house1, const Houses& house2)
{
if (house1.year_construct == house2.year_construct)
return house1.year_construct < house2.year_construct;
return house1.year_construct < house2.year_construct;
}
};
~Houses();//деструктор
};
Реалізація методів в окремому файлі:
#include "pch.h"
#include "houses.h"
Houses::Houses() //Конструктор
{
}
//Конструктор ініціалізації
Houses::Houses(string street, int number_house, int kol_meshk, int year_construct, string date, string repair)
{
this->setStreet(street);
this->setHouseNumber(number_house);
this->setKolMeshk(kol_meshk);
this->setYearConstruct(year_construct);
this->setDate(date);
this->setRepair(repair);
}
//Методи Get
string Houses::getStreet()
{
return this->street;
}
int Houses::getHouseNumber()
{
return this->number_house;
}
int Houses::getKolMeshk()
{
return this->kol_meshk;
}
int Houses::getYearConstruct()
{
return this->year_construct;
}
string Houses::getDate()
{
return this->date;
}
string Houses::getRepair()
{
return this->repair;
}
//Методи Set
void Houses::setStreet(string street)
{
this->street = street;
}
void Houses::setHouseNumber(int number_house)
{
this->number_house = number_house;
}
void Houses::setKolMeshk(int kol_meshk)
{
this->kol_meshk = kol_meshk;
}
void Houses::setYearConstruct(int year_construct)
{
this->year_construct = year_construct;
}
void Houses::setDate(string date)
{
this->date = date;
}
void Houses::setRepair(string repair)
{
this->repair = repair;
}
Houses::~Houses() //деструктор
{
}
//Дружні функції введення-виведення
ostream& operator<<(ostream& out, Houses& h)
{
/*int numb = i + 1;
cout << " " << setw(8) << right << numb << "|";*/
out << " " << setw(26) << left << h.street << "|";
out << setw(16) << right << h.number_house << " |";
out << setw(20) << right << h.kol_meshk << " |";
out << " " << setw(13) << right << h.year_construct << "|";
out << " " << setw(25) << right << h.date << "|";
out << " " << setw(26) << left << h.repair;
return out;
}
istream& operator>>(istream& in, Houses& h) //тут чомусь при валідації відбувається зациклення
{
cout << "Назва вулиці: ";
while (1)
{
in >> h.street;
if (h.street[0] >= '0' && h.street[0] <= '9' || h.street[0] == '!' || h.street[0] == '~' || h.street[0] == '@' || h.street[0] == '#' || h.street[0] == '№' || h.street[0] == '$' || h.street[0] == '%' || h.street[0] == '^' || h.street[0] == '&' || h.street[0] == '*' || h.street[0] == '(' || h.street[0] == ')' || h.street[0] == '+' || h.street[0] == '=' || h.street[0] == '[' || h.street[0] == ']' || h.street[0] == '{' || h.street[0] == '}' || h.street[0] == ';' || h.street[0] == ':' || h.street[0] == '"' || h.street[0] == '<' || h.street[0] == '>' || h.street[0] == ',' || h.street[0] == '.' || h.street[0] == '?' || h.street[0] == '/' || h.street[0] == '|')
cout << "У назві вулиці присутні неприпустимі символи!Введіть її заново.." << endl << endl;
else
break;
}
cout << "Номер будинку: ";
while (1)
{
in >> h.number_house;
if (cin.fail() || h.number_house <= 0 || h.number_house > 10000)
{
cin.clear();
cin.sync();
cout << "Номер будинку введено неправильно! Введіть його заново.." << endl;
}
else
break;
}
cout << "Кількість жителів: ";
while (1)
{
in >> h.kol_meshk;
if (cin.fail() || h.kol_meshk < 0 || h.kol_meshk > 10000)
{
cin.clear();
cin.sync();
cout << "Введено неправильне значення кількості жителів у будинку! Введіть його заново.." << endl;
}
else
break;
}
cout << "Рік побудови будинку: ";
while (1)
{
in >> h.year_construct;
if (cin.fail() || h.year_construct < 0 || h.year_construct > 10000)
{
cin.clear();
cin.sync();
cout << "Введено неправильне значення року побудови будинку! Введіть його заново.." << endl;
}
else
break;
}
cout << "Дата постановки на облік: ";
while (1)
{
in >> h.date;
if ((h.date[2] == '.') && (h.date[5] == '.') && ((((h.date[0] - '0') * 10) + (h.date[1] - '0')) <= 30) && ((((h.date[3] - '0') * 10) + (h.date[4] - '0')) <= 12) && ((((h.date[6] - '0') * 1000) + ((h.date[7] - '0') * 100) + ((h.date[8] - '0') * 10) + ((h.date[9] - '0'))) <= 2020) && ((((h.date[6] - '0') * 1000) + ((h.date[7] - '0') * 100) + ((h.date[8] - '0') * 10) + ((h.date[9] - '0'))) >= 1950))
break;
else
cout << "Введено неправильне значення дати постановки на облік! Введіть її заново.." << endl;
}
cout << "Наявність ремонту (так/ні): ";
while (1)
{
in >> h.repair;
if (h.repair == "так\0" || h.repair == "ні\0" || h.repair == "Ні\0" || h.repair == "Так\0")
break;
else
cout << "Введено некоректнy відповідь щодо наявності ремонту! Введіть її заново.." << endl;
}
return in;
}
void Houses::shapka()
{
cout << " ";
line(150);
cout << endl;
cout << " ";
line2(1);
cout << " № запису | Назва вулиці | Номер будинку | Кількість мешканців | Рік побудови | Дата постановки на облік | Ремонт за останні 20 років ";
line2(1);
cout << endl << " ";
line2(1);
linee(150);
line2(1);
cout << endl << " ";
}
В цьому файлі йде оголошення списку:
#pragma once
#include <list>
#include "houses.h"
#include <iostream>
class HousesList //Оголошення класу
{
private:
list<Houses> houses;
Houses h;
public:
HousesList(); //Порожній конструктор
void addHouses(Houses); // метод введення інформації про будинки
void printByGrowth(); // метод виведення інформації про будинки за зростанням за роком побудови
void printHouses(); // метод виведення інформації про будинки без ремонту за останні 20 років, які побудовані до 1941 року та к-сть мешканців в яких більше 50
~HousesList(); //деструктор
};
Тут реалізація методів з попереднього файлу:
#include "pch.h"
#include "listHouses.h"
HousesList::HousesList()//Конструктор
{
}
void HousesList::addHouses(Houses h)// метод введення інформації про аварійні будинки
{
houses.push_back(h);
cin.get();
}
void HousesList::printByGrowth() // метод виведення інформації про будинки
{
system("cls"); // очищення екрану
system("color 70"); // встановлення кольору за замовчуванням
ofstream ft ("recordSort.txt");
this->houses.sort(Houses::HousesComparator());
if (this->houses.size() <= 0) {
cout << "Список порожній!"<<endl;
}
else
{
h.shapka();
for (auto i : this->houses) {
cout << i;
ft << i;
}
}
ft.close();
cin.get();
}
void HousesList::printHouses() //метод виведення інформації про будинки без ремонту за останні 20 років, які побудовані до 1941 року та к-сть мешканців в яких більше 50
{
system("cls"); // очищення екрану
system("color 70"); // встановлення кольору за замовчуванням
ofstream ft("printHouses.txt");
list<Houses> withoutRepair;
for (auto i : this->houses)
{
if (i.getKolMeshk() > 50 && i.getYearConstruct() < 1941 && (i.getRepair() == "Ні\0" || i.getRepair() == "ні\0" || i.getRepair()=="no\0" || i.getRepair()== "No\0"))
withoutRepair.push_back(i);
}
withoutRepair.sort(Houses::HousesComparator());
if (withoutRepair.size() <= 0) {
cout << "Список порожній!"<<endl;
}
else {
h.shapka();
for (auto i : withoutRepair) {
cout << i;
ft << i;
}
}
ft.close();
cin.get();
}
HousesList::~HousesList() //деструктор
{
}
Кілька днів не можу знайти помилку. Можливо, не до кінця зрозуміла тему, адже жодних пояснень в коледжі не було. Припускаю, що або проблема в мене з файлами, або я десь неправильно звертаюсь. Надіюсь на допомогу. Дякую)