为什么istream.clear()在读取双精度和字符串时删除部分字符串?

时间:2014-10-27 02:39:12

标签: c++ cin istream

我正在阅读一个文字文件,其中包含以下格式的名称和成绩:

Polly 95 99 95 94 93 98 99 
Abraham 80 85 81 86 95 78 81 

我使用以下代码将每个学生读入Student_info结构:

// read homework grades from an input stream into a vector<double>
istream& read_hw(istream& in, vector<double>& hw)
{
    if (in)
    {
        // get rid of previous content
        hw.clear();

        // read hw grades
        double grade;
        while (in >> grade) hw.push_back(grade);

        // clear the stream so that input will work for next student
        in.clear();

    }
    return in;
}

istream& read(istream& in, Student_info& s)
{
    // read and store the student's name, midterm, and final
    in >> s.name >> s.midterm >> s.final;
    //std::cout << "The name is " << s.name << std::endl;

    read_hw(in, s.homework);
    return in;
}

稍后我会打印每个学生的姓名和整体成绩,但会发生一些奇怪的事情。而不是

Polly 96.6
Abraham 82.2

第一个(Polly)之后的每个名字都被部分切断:

Polly 96.6
raham 82.2

我认为这与清除流为下一个学生做好准备有关:

in.clear();

它似乎丢掉了下一个学生名字的开头,但我不能只是摆脱这一行,因为istream需要返回OK状态。

我怎样才能完成这项任务,但要确保我不会丢弃每个学生名字的一部分? (我假设我可能事先不知道有多少家庭作业,所以我不能简单地阅读6个双打然后再继续。)

1 个答案:

答案 0 :(得分:1)

  

我怎样才能完成这项任务,但要确保不丢弃每个学生名字的一部分?

std::string line;
if (getline(in, line))
{
    std::istringstream iss(line);
    while (iss >> grade)
        hw.push_back(grade);
}

这是一种更结构化的方法,需要在当前行列出数字。