gpt4 book ai didi

C++ 为什么我需要文件的两端?

转载 作者:行者123 更新时间:2023-11-30 03:49:25 25 4
gpt4 key购买 nike

这是我的代码:

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:麦克韦?

主要:http://dumptext.com/4bfKcJL7

student_info.cpp:http://dumptext.com/AwgTkIYX

student_info.h: [ABOVE]/tamQmvbi - 显然需要更多代表才能获得超过 2 个链接

最佳答案

你做错了(无论如何忽略 EOF)。

  • 使用“std::cin”交互永远不会有 EOF(除非用户输入某些终端/控制台特定的 EOF 击键)。
  • 在管道(POSIX:pipe)或类似的管道中使用“std::cin”应该在某个时间点有一个 EOF。

您在 read_hw 中检查提取是否成功,但在 read 中没有检查。此外,您以随机方式放置 istream::clear()。此外,您需要 std::getline (或类似的)来解析 std::cin (交互式),可靠。

关于C++ 为什么我需要文件的两端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com