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

Joh*_*ohn 1 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意味着"文件结束"并且可能"用于表示结束用户输入"(重要的是,因为,即使我的教授是错的,有人可能会说,如果他特意告诉我们,我应该采用他的标准.但他没有告诉我们).

使用EOF用户输入的正确方法是什么?我教授的陈述是"在EOF之后,应该没有更多的输入程序"使用EOF的标准和预期方式吗?如果程序接受可变数量的输入,对其执行某些操作,然后接受更多变量输入,那么使用EOF这些输入是不可接受的(while(cin >> user_input)也就是说不在该场景中使用)?如果是这样,在您多次接受变量输入的情况下,是否有一个标准用于表示输入结束?

我对作业的确切解决方案如下.我对主要作业的解决方案"编写一个输入未指定数量的整数("int")值的程序,然后输出输入的最小值和最大值"被认为是正确的,通过赋值的第二部分"make当用户根本没有输入任何整数(只是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;
}
Run Code Online (Sandbox Code Playgroud)

注意:我在这个提交上得到的额外反馈是:不使用c库(显然stdlib.h是一个),并且在某些计算机上(虽然显然不是我的),#include <stdexcept>将需要编译.

回答

简短回答:我的导师是对的.使用时cin,不会有任何其他用户输入EOF信号.显然,在某些情况下,程序不会让您输入更多信息,但是,正如@hvd指出的那样

虽然您的系统可能会让您继续从同一文件中读取它来自TTY的特定情况,但由于EOF在那里被伪造,您通常不应该依赖它.

Aka,因为我正在使用终端输入用户输入,所以该程序正常工作.一般来说,它不会起作用.

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

没有标准手段或通常实践的编码标准来指示用户输入暂时何时结束.你必须提出自己的机制.例如,如果用户输入"结束",您可以使用它来推断用户暂时已结束输入.但是,您必须向用户表明他们需要输入的内容.当然,您必须编写代码来处理此类输入.

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

R S*_*ahu 6

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

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

如果您正在读取文件,则可以重置std::ifstream其到达EOF时的状态,以便再次读取文件的内容.

但是,如果您正在读取数据std::cin,一旦达到EOF,您将无法再阅读std::cin.

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

  • @John,我的意思是*不能*,而不是*不应该*.使用`cin.clear()`清除错误状态,但它不会重置`cin`的EOF状态.例如,如果您尝试读取整数但输入不是整数,则`cin`将处于错误状态.`cin.clear()`将清除该状态.*我得到的意思是EOF不应该被用来表示来自终端的可变长度用户输入的结束.* - 这是正确的. (3认同)