2014-10-27 13 views
0

我读,包括名称和等级与格式的文本文件:为什么istream.clear()在读取双打和字符串的同时删除部分字符串?

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 96.6 
raham 82.2 

我相信这是与流清除,以准备其下一学生:

in.clear(); 

好像被扔掉的下一个学生的名字的开头,但我不能只是摆脱这一行的,因为istream的需要回归到一个正常的状态。

我该如何完成这项任务,但要确保我不扔掉每个学生的名字的一部分? (我假设我可能不知道之前有多少作业分配,所以我不能简单阅读6个双打,然后继续前进。)

+0

你的阅读循环在哪里?因为你到目前为止使用我的阅读循环为我工作。 – Galik 2014-10-27 03:17:17

回答

1

我该如何完成这项任务,但要确保我没有扔掉每个学生的名字的一部分?

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

这是一个更为结构化的方法,需要在当前行中列出的号码。