C ++ чтение данных из файла * .txt в вектор структуры - PullRequest
0 голосов
/ 05 мая 2018

Я новичок в C ++ и у меня возникли некоторые недопонимания по поводу чтения / записи файлов ...

У меня есть файл данных .txt, который содержит информацию об улицах, т.е. улице, домашнем номере и количестве квартир

У меня есть задача прочитать данные из файла, добавить новый, удалить ненужные и сделать некоторые расчеты о количестве квартир на определенной улице

Для хранения данных при работе программы я создал вектор структуры:

struct homeAdressBook {
    std::string street;
    char homeNumber[255];
    int flats;
};

std::vector<homeAdressBook> HAB;

Код программы ниже:

std::fstream document;
    document.open("name.txt");
    if (!document) {
        std::ofstream document;
        document.open("name.txt");
    }
    if (!document)
        std::cout << "File open error" << std::endl;
    else {
//Here (while loop) I want to read data from a file and add to my vector of struct for further usage, it partly works somehow but this point is unclear for me
        while (!document.eof()) {
            HAB.push_back(homeAdressBook());
            std::getline(document, HAB[i].street);
            document >> HAB[i].street;
            document >> HAB[i].homeNumber;
            document >> HAB[i].flats;
            i++;
        }
        document.close();
        do {
            switch (menu()) {
            case 0: {
                document.close();
                exit = false;
                break;
            }
//Here (case 1) I add new data and write it in file, here I have no problems at the moment
            case 1: {
                document.open("name.txt", std::ios::app);
                HAB.push_back(homeAdressBook());
                std::cin.ignore();
                std::cout << "Enter the address: ";
                std::getline(std::cin, HAB[i].street);
                std::cout << "Enter home number: ";
                std::cin.getline(HAB[i].homeNumber, 255);
                std::cout << "Enter number of flats: ";
                std::cin >> HAB[i].flats;
                document << HAB[i].street << HAB[i].homeNumber << HAB[i].flats << std::endl;
                document.close();
                i++;
                break;
            }
//Here (case 2) I want to read data from a file, it reads data except first line of data
            case 2: {
                int total = i;
                std::cout << std::setw(20) << "Street" << std::setw(20) << "Home Number" << std::setw(20) << "Number of flats" << std::endl;
                document.open("name.txt", std::ios::in);
                for (int j = 0; j < total; j++) {
                    std::cout << std::setw(20) << HAB[j].street << std::setw(20) << HAB[j].homeNumber << std::setw(20) << HAB[j].flats << std::endl;
                }
                document.close();
                break;
            }
//Here (case 3) data should be deleted from a file if necessary
            case 3: {
                document.open("name.txt", std::ios::out | std::ios::in);
                int strDelete = 0;
                std::cout << "0. Exit to main menu" << std::endl;
                for (i = 0; i < HAB.size(); i++) {
                    std::cout << i + 1 << ". " << HAB[i].street << std::endl;
                }
                std::cout << "\nType number of street to delete: ";
                std::cin >> strDelete;
                if (strDelete)
                    i--;
                else break;
                HAB.erase(HAB.begin() + (strDelete - 1));
                document.close();
                break;
            }
            }
        } while (exit);
    }
    system("pause");
    return 0;
}

Данные в .txt файле записываются так:

aaa street 10 50
aaa street 10 45
bbb street 1 10
ccc street 1 12
ccc street 1/10 25

Каждая строка в файле .txt принадлежит [i] -s вектору элементов структуры Я не могу понять, как правильно добавлять данные из файла .txt к моему вектору структур во время работы программы (название улицы может содержать до 5 или 6 слов и как программа может отделить, является ли это название улицы или это домашний номер или количество квартир)

1 Ответ

0 голосов
/ 05 мая 2018

Я рекомендую перегрузить operator>> для вашей структуры:

struct homeAdressBook
{
    std::string column1;
    std::string street;
    std::string homeAddress;
    int flats;
    friend std::istream& operator>>(std::istream& input, homeAddressBook& address);
};

std::istream& operator>>(std::istream& input, homeAddressBook& address)
{
  input >> address.column1;
  input >> address.street;
  input >> address.homeAddress;
  input >> address.flats;
  return input;
}

Вышеизложенное позволит вам изменить процесс ввода на:

std::vector<homeAddressBook> database;
homeAddressBook record;
//...
std::ifstream data_file("addresses.txt");
while (data_file >> record)
{
  database.push_back(record);
}

Примечания

  1. Ваш пост описывает 3 столбца в данных, но ваш источник данных показывает 4.
  2. Вы открываете document как выходной поток (ostream) и используете getline в выходном потоке.
  3. В названии вашей структуры есть "книга", что подразумевает коллекцию из Предметы. Я рекомендую использовать имя, такое как "Home_Address", чтобы указать один предмет. Используйте std::vector для книги.

Редактировать 1:
Префиксные члены в operator>> с «адресом».

...