Отображать имена, когда входной текст разделен # в C ++? - PullRequest
0 голосов
/ 31 марта 2020

Итак, входной текст файла list.txt имеет вид: FirstName LastName # Age Моя задача - прочитать файл list.txt из четырех строк вышеуказанной формы и вывести имя с наибольшим возрастом. Ниже я напишу свое решение, которое работает, но только если # удалено и входы разделены пробелом. Не знаете, как это сделать с присутствующим #? Я понимаю, что могу использовать getline (), просто не знаете как? Например: Alpha Beta # 22 Gama Delta # 10, а на выходе должно быть имя самого старшего человека с указанием его возраста. Пожалуйста, сориентируйте меня на правильное решение. Спасибо заранее! :)

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream ins;   // declare an input file stream object

    ins.open("list.txt");  // open the file
    if (ins.fail()) {     // check if there was an error
        cout << "Error opening file";
        return -1;
    }

    string maxName;   // 
    int maxAge = 0; // 



    for (int i = 0; i < 4; i++) {   // read four lines from the file
        string firstName, lastName;
        int age;
        ins >> age;  // read three variables from the stream line

        if (nr > maxAge) {   // update the current maximum if greater
            maxAge = age;
            maxName = firstName + " " + lastName;
        }
    }

    ins.close();   // close the file

    cout << " The oldest person is: " << maxName
        << " : " << maxAge << endl;

    return 0;
}

1 Ответ

0 голосов
/ 31 марта 2020

Вот мой код для вас.

struct Record
{
    std::string first_name;
    std::string last_name;
    unsigned int age;  // Ever hear of a negative age?
    friend std::istream& operator>>(std::istream& input, Record& r);
};

std::istream& operator>>(std::istream& input, Record& r)
{
    input >> r.first_name;
    std::getline(input, r.last_name, '#');
    input >> r.age;
    return input;
}

Вот ввод l oop:

std::vector<Record> database;
Record r;
while (ins >> r)
{
    database.push_back(r);
}

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

При чтении фамилии используется форма std::getline с параметром-разделителем. Функция будет читать символы, сохраняя их в строку, пока не будет прочитан разделитель. Функция не хранит разделитель.

Поскольку позиция входного потока находится за «#», operator>> может использоваться для чтения в возрасте.

При следующем чтении пропустится оставшаяся новая строка (потому что это пробел), будет прочитано имя второй записи и т. Д.

operator>> перегружен в структуре Record для увеличения инкапсуляции и уменьшения плотно связанных модулей. Record знает о своих членах, а внешние лица не должны.

...