首页 > 解决方案 > 如何将逗号分隔的 txt 文件流式传输到类对象?

问题描述

如何将一行逗号分隔的 txt 文件流式传输到包含名字、姓氏和年龄变量的对象?我想重载>>操作员来做这样的操作。

std::istream& operator>>(std::istream& file, PersonData& obj) {
    std::string line, firstName, lastName, age;

    while (std::getline(file, line)) {
        std::stringstream ss(line);
        std::getline(ss,firstName,',');
        std::getline(ss,lastName,',');
        std::getline(ss, age,',');
        firstName >> obj.firstName;
        lastName >> obj.lastName;
        std::stoi(age) >> obj.age;
    }

    return file; 
}

标签: c++

解决方案


operator>>应该从文件中读取单个条目。

如果你有课

struct Person {
    std::string first_name;
    std::string last_name;
    unsigned age;
};

您可以使用输入/输出运算符:

std::ostream& operator<<(std::ostream& out,const Person& p) {
    out << p.first_name << ", " << p.last_name << ", " << p.age;
    return out;
}

std::istream& operator>>(std::istream& in,Person& p){
    const auto comma = ',';
    std::getline(in,p.first_name,comma);
    std::getline(in,p.last_name,comma);
    std::string temp;
    std::getline(in,temp);
    p.age = std::stoi(temp);
    return in;
}

然后从文件中一次提取一个人:

int main() {
    std::stringstream ss{"Peter, Fish, 42\nLaura, Peterson, 105"};
    Person p1,p2;
    ss >> p1 >> p2;
    std::cout << p1 << "\n" << p2;
};

输出:

Peter,  Fish, 42
Laura,  Peterson, 105

活生生的例子

要从文件中读取所有条目,您可以使用向量和循环:

std::vector<Person> persons;
Person entry;
while(stream >> entry) persons.push_back(entry);

PS:我错过了从名称中删除前导空格。我会把它留给你;)


推荐阅读