在C ++中用#分隔输入文本时显示名称?

问题描述 投票:0回答:1

因此,list.txt文件的输入文本的格式为:FirstName LastName#Age我的任务是读取上述形式的四行的list.txt文件,并输出年龄最大的名称。我将在下面编写我的解决方案,该解决方案有效,但仅当删除#且输入由空格分隔时才有效。不确定在存在#的情况下该如何做?我知道我可以使用getline(),只是不确定如何?例如:Alpha Beta#22Gama 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;
}
c++ file c++11 input getline
1个回答
-1
投票

这是我给你的代码。请注意,这是CSV(逗号分隔值)的一种实现。

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;
}

这里是输入循环:

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

由于名字和姓氏之间用空格分隔,因此operator>>可用于读取名字。

阅读姓氏时使用带有分隔符参数的std::getline形式。该函数将读取字符,并将其存储到字符串中,直到读取定界符为止。该函数不存储定界符。

由于输入流的位置在'#'之后,因此operator>>可用于读取年龄。

下一次读取将跳过剩余的换行符(因为它是空格),并读取第二条记录的名字,依此类推。

operator>>Record结构中过载,以增加封装并减少紧密耦合的模块。 Record不了解其成员,而外部实体则不应。

© www.soinside.com 2019 - 2024. All rights reserved.