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

标签 c++ eof

这是我的代码:

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/

相关文章:

c++ - 实现指向对象的指针的模板化双向链表

c++ - 以 fstream::out 模式打开 fstream 是否会删除其当前内容?

c++ - 使用 visual stdio2008 的线程

c++ - 如何将 C++ 类实例(使用 STL 容器)加载/保存到磁盘

c - 如何在 ARMv8 汇编中输入 EOF?

c - 如何正确使用scanf和EOF?

c - 在最后写入的行之后,我希望它声明文件结尾而不是生成新行

C++:std::istream 检查 EOF 而不读取/消耗 token /使用运算符>>

CyclicBarrier 中的 C++ 倒计时使用原子变量出错 [请使用无锁解决方案]

c++ - 在面中插入边 - CGAL 错误 : assertion violation