这是我的代码:
while (read(cin, record)) {
//find length of longest name
maxlen = max(maxlen, record.name.size());
students.push_back(record);
}
并在另一个来源
istream& read(istream& is, Student_info& s)
{
//read and store the students name and midterm and final exam grades
is >> s.name >> s.midterm >> s.final;
read_hw(is, s.homework);
return is;
}
istream& read_hw(istream& in, vector<double>& hw)
{
if (in) {
//get rid of previous contents
hw.clear();
//read homework grades
double x;
while (in >> x)
hw.push_back(x);
//clear the stream so that input will work for the next student
in.clear();
}
return in;
}
正确,因此除了需要两个文件末端来打破while循环这一事实之外,这完全符合预期/需要。我有一个假设:
调用in.clear();那个时候会清除第一个EOF,所以最终会没有效果。
但是我不认为这可能就像我用任何字母或单词替换第二个EOF一样,循环仍会破坏。
我已经多次使用Debug了,我想不出任何东西。提前感谢您的帮助。
编辑:我正在关注一本很老的书(加速C ++)(2001),这是他们使用的方法。他们使用的方法可能已经过时或简化了。我写的例子没有说明可能有多少作业。因此,它似乎假设有更多的作业,直到有一个输入不能放入双x。
以下是可能粘贴的示例输入:
DBMA 24 66 16 89 68 57
XORM 0 64 18 65 34 34
DHKQ 8 65 32 77 79 99
NZXI 86 49 7 43 57 17
WGIN 8 85 99 69 41 58
GMXD 15 47 25 18 53 45
KSIQ 71 19 65 55 20 49
NSRY 52 35 49 32 9 59
RUMB 5 30 59 64 39 32
ZGBM 95 62 67 71 50 76
TSRQ 70 25 15 89 77 71
FQDI 84 82 96 55 92 93
VLOJ 75 25 11 51 43 83
这里有一个示例输出(注意后一部分涉及我未展示的程序部分):
DBMA 24 66 16 89 68 57
XORM 0 64 18 65 34 34
DHKQ 8 65 32 77 79 99
NZXI 86 49 7 43 57 17
WGIN 8 85 99 69 41 58
GMXD 15 47 25 18 53 45
KSIQ 71 19 65 55 20 49
NSRY 52 35 49 32 9 59
RUMB 5 30 59 64 39 32
ZGBM 95 62 67 71 50 76
TSRQ 70 25 15 89 77 71
FQDI 84 82 96 55 92 93
VLOJ 75 25 11 51 43 83
^D
^D
Passing Students:
DBMA 69.8
DHKQ 74.6
FQDI 105
TSRQ 69
WGIN 74.8
ZGBM 85.6
Failing Students:
GMXD 44.8
KSIQ 53.6
NSRY 50.4
NZXI 57.4
RUMB 44.4
VLOJ 54
XORM 46
Press any key to continue . . .
编辑2: MCVE?
主要:http://dumptext.com/4bfKcJL7
student_info.cpp:http://dumptext.com/AwgTkIYX
student_info.h:[上图] / tamQmvbi - 显然需要更多代表超过2个链接
答案 0 :(得分:3)
你做错了(无论如何都忽略了EOF)。
您正在检查class ManipulationTools():
def click(self, x,y, numclicks):
中的成功提取,但不是read_hw
。此外,您可以随机放置read
。此外,您需要std :: getline(或类似)来解析std :: cin(交互式),可靠。
答案 1 :(得分:0)
每一行都有相同数量的令牌。
之后
is >> s.name >> s.midterm >> s.final;
每行剩下四个令牌。您可以更改read_hw
以利用该信息:
istream& read_hw(istream& in, vector<double>& hw)
{
//get rid of previous contents
hw.clear();
for ( int i = 0; i < 4; ++i )
{
double x;
if (in >> x)
{
hw.push_back(x);
}
else
{
// Problem.
// Return prematurely.
return in;
}
}
return in;
}
如果您不能依赖要修复的家庭作业分数,您可以使用std::getline()
阅读其余部分,然后使用std::istringstream
处理其余部分。
istream& read_hw(istream& in, vector<double>& hw)
{
//get rid of previous contents
hw.clear();
// Read the rest of the line
std::string line;
std::getline(in, line);
// If there was an error in reading the rest of the line, return
if ( !in )
{
return in;
}
// Extract the numbers from the line using an istringstream
std::istringstream str(line);
double x;
while (str >> x)
{
hw.push_back(x);
}
return in;
}