C ++为什么我需要两个文件结尾?

时间:2015-09-14 18:21:02

标签: 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: MCVE?

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

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

student_info.h:[上图] / tamQmvbi - 显然需要更多代表超过2个链接

2 个答案:

答案 0 :(得分:3)

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

  • 使用&#39; std :: cin&#39;交互式永远不会有EOF(除非用户输入一些终端/控制台特定的EOF键击)。
  • 拥有&#39; std :: cin&#39;在管道(POSIX:管道)或类似的应该在某个时间点有一个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;
}