正确使用EOF(可以在程序中多次使用吗?)

时间:2017-07-16 06:33:16

标签: c++

在我的编程课程(c ++)中,讲师告诉我们:

  

"编写一个输入未指定数量的整数的程序(" int")   值然后输出最小值和最大值   进入了。始终输入至少一个值。 (阅读所有输入   直到EOF)。为了额外的功劳,您的程序也可以在用户使用时运行   根本不输入任何整数(只是EOF。)"

我想得到一些幻想,因此,在我的解决方案中,当输入EOF时,程序会以"Oops! You didn't enter anything. Please try again, this time entering at least one integer: "响应并再次提示输入。

我的导师说这个答案是错误的,因为

  

在EOF之后,应该没有更多的程序输入(两者都没有   预期的用户和程序) - 使用EOF切换   输入到另一种输入模式的“一种模式”不支持   标准。

  1. 我在互联网上找到的EOF的每个定义似乎都不支持我教授的定义。从我所知道的,EOF被简单地定义为当前文件的结尾。在EOF之前接受用户的输入,对该输入执行某些操作,然后再次请求EOF之前请求其他输入似乎完全有效。
  2. 因为这是一个在线课程,我能够回顾我们学到的与EOF有关的所有内容,我们只被告知EOF意味着"文件结束"并且可以用来表示用户输入的结束' (重要的是,因为,即使我的教授错了,也可以说如果他特意告诉我们,我应该采用他的标准。但他并没有告诉我们。)
  3. 在用户输入中使用EOF的正确方法是什么?是我的教授的声明"在EOF之后,应该没有更多的输入到一个程序"标准  和预期使用EOF的方式?如果程序接受可变数量的输入,对其执行某些操作,然后接受更多变量输入,那么将EOF与这些输入一起使用是不可接受的(也就是说不要使用while(cin >> user_input)那场景)?如果是这样,在您多次接受变量输入的情况下,是否有一个标准用于表示输入结束?

    我对作业的确切解决方案如下。我对主要赋值的解决方案"编写一个程序,输入一个未指定数量的整数(" int")值,然后输出输入的最小值和最大值"被认为是正确的,通过作业的第二部分"当用户根本没有进入任何一个整体(只是EOF)时,你的程序也能正常工作。"被认为是不正确的("使程序也正常工作"是我们获得的唯一提示)。

    非常感谢任何反馈!!显然,我对我的教授的反馈/决定持怀疑态度,但总的来说,我只是试图了解C ++社区标准。

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <stdlib.h>
    
    using namespace std;
    
    int main(){
      string user_input;
    
      int int_input, min_user_input, max_user_input;
      bool do_it = true;
    
      cout << "Hi John," << endl;
      cout << "Please enter a few integers (signal EOF when finished): ";
    
      while(do_it) {
        cin.clear();
        cin >> user_input;
    
        if (user_input.empty()) {
          cout << endl;
          cout << "Oops! You didn't enter anything. Please try again, this time entering at least one integer: ";
        }
        else {
          try {
            int_input = atoi( user_input.c_str() );
    
            min_user_input = int_input;
            max_user_input = int_input;
    
            while(cin >> int_input) {
              if (min_user_input > int_input) {
                min_user_input = int_input;
              }
    
              if (max_user_input < int_input) {
                max_user_input = int_input;
              }
            }
    
            cout << endl;
            cout << "The max user input was: " << max_user_input << endl;
            cout << "The min user input was: " << min_user_input << endl;
            do_it = false;
          }
          catch (std::invalid_argument) {
            cout << endl;
            cout << "Oops! You didn't enter an integer. Please try again, this time only entering integers: ";
            do_it = true;
          }
        }
      }
    
      return 0;
    }
    

    注意:我在此次提交中获得的其他反馈是:不使用c库(显然stdlib.h是一个),并且在某些计算机上(尽管显然不是我的),{{1将需要编译。

    答案

    简短的回答:我的导师是对的。与#include <stdexcept>一起使用时,cin信号后不会有其他用户输入。显然,在某些情况下,该程序不会让您输入更多信息,但是,正如@hvd指出的那样

      

    虽然您的系统可能会让您继续阅读同一个文件   在特定情况下,由于EOF,它来自TTY   在那里伪造,你通常不应该依赖它。

    Aka,因为我使用终端输入用户输入,程序才能正常工作。一般来说,它不会起作用。

    正如@RSahu回答的那样,EOF不应该用于在程序中多次发出变长EOF的结束信号。重要的

      

    没有标准手段或通常实践的编码标准   指示用户输入暂时何时结束。你有   想出你自己的机制。例如,如果用户输入   &#34;结束&#34;,您可以使用它来推断用户已结束输入   暂且。但是,您必须向用户表明这是什么   他们需要进入。当然,你必须编写代码来处理   这样的输入。

    因为这项任务需要使用EOF,我试图完成的是无意中禁止的(也就是接收输入,检查它,可能会收到更多输入)。

2 个答案:

答案 0 :(得分:6)

  

正确使用EOF(可以在程序中多次使用吗?)

没有单一的EOF。每个输入流都有一个EOF。

如果您正在从文件中读取文件,则可以在{E范围到达EOF时重置std::ifstream的状态,以便再次读取该文件的内容。

但是,如果您正在阅读std::cin的数据,则一旦达到EOF,您就无法再从std::cin开始阅读。

在您的课程中,您的教授是对的。他们最有可能在谈论从std::cin阅读。

答案 1 :(得分:1)

  根据我的判断,

EOF被简单地定义为当前文件的结尾。

是的。请注意,特别是,它并不意味着自动启动新文件。

虽然您的系统可能会让您继续从同一个文件中读取它来自TTY的特定情况,但由于EOF在那里伪造,您通常不应该依赖它。试试program </dev/null,看看当你尝试自动化程序时就会发生。