【问题标题】:C++ getline multiple variable types using comma as delimiterC++ getline 使用逗号作为分隔符的多个变量类型
【发布时间】:2013-10-07 02:19:07
【问题描述】:

我正在尝试做一项家庭作业,该作业需要将 txt 文件中的数据读入变量。该文件的每一行都有“姓氏,首字母,数字,数字”。我使用以下代码使 get 行部分工作。

    ifstream inputFile("Students.txt");
string line;

string Surname;
string Initial;
int number1, number2;

while (getline(inputFile, line))
{
    stringstream linestream(line);

    getline(linestream, Surname, ',');
    getline(linestream, Initial, ',');
    getline(linestream, number1, ',');
    getline(linestream, number2, ',');

    cout << Surname << "---" << Initial << "-" << number1 << "-" << number2 << endl;

}

这会引发编译错误,但如果我将 number1 和 number2 声明为字符串,它可以正常工作。所以我的问题是,我必须将 getline 作为字符串然后转换为 int 变量还是有更好的方法?

【问题讨论】:

标签: c++ csv getline


【解决方案1】:

std::getline 将std::basic_istream 的对象作为第一个参数。它不适用于任何其他对象。

我所做的是使用csv_whitespace 类添加逗号作为分隔符。例如:

class csv_whitespace
    : public std::ctype<char>
{
public:
    static const mask* make_table()
    {
        static std::vector<mask> v(classic_table(), classic_table() + table_size);
        v[','] |= space;
        v[' '] |= space;
        return &v[0];
    }

    csv_whitespace(std::size_t refs = 0) : ctype(make_table(), false, refs) { }
};

int main()
{
    std::ifstream in("Students.txt");
    std::string line;

    std::string surname;
    std::string initial;
    int number1, number2;

    while (std::getline(in, line))
    {
        std::stringstream linestream(line);
        linestream.imbue(std::locale(linestream.getloc(), new csv_whitespace));

        getline(linestream, surname, ',');
        getline(linestream, initial, ',');

        linestream >> number1 >> number2;
    }
}

【讨论】:

    【解决方案2】:

    是的,getline 函数的第二个参数根据定义必须是一个字符串,它将包含您提取的字符串。只需将 number1 和 number2 声明为字符串,然后使用 stoi() (C++11) 或 atoi() 函数将它们转换为整数:

    string strNumber1;
    string strNumber2;
    getline(linestream, strNumber1, ',');
    getline(linestream, strNumber2, ',');
    int number1 = stoi(strNumber1);
    int number2 = atoi(strNumber2.c_str());
    

    希望对你有帮助

    【讨论】:

    • stoi 和 atoi 的问题是除非我使用 -std=c++11 选项,否则它不会在我的编译器上编译。有没有其他功能可以做到?
    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2020-08-09
    • 1970-01-01
    • 2020-12-04
    • 2019-06-09
    相关资源
    最近更新 更多