在我的编程课程(c ++)中,讲师告诉我们:
"编写一个输入未指定数量的整数的程序(" int") 值然后输出最小值和最大值 进入了。始终输入至少一个值。 (阅读所有输入 直到EOF)。为了额外的功劳,您的程序也可以在用户使用时运行 根本不输入任何整数(只是EOF。)"
我想得到一些幻想,因此,在我的解决方案中,当输入EOF
时,程序会以"Oops! You didn't enter anything. Please try again, this time entering at least one integer: "
响应并再次提示输入。
我的导师说这个答案是错误的,因为
在EOF之后,应该没有更多的程序输入(两者都没有 预期的用户和程序) - 使用
EOF
切换 输入到另一种输入模式的“一种模式”不支持 标准。
EOF
的每个定义似乎都不支持我教授的定义。从我所知道的,EOF
被简单地定义为当前文件的结尾。在EOF
之前接受用户的输入,对该输入执行某些操作,然后再次请求EOF
之前请求其他输入似乎完全有效。EOF
有关的所有内容,我们只被告知EOF
意味着"文件结束"并且可以用来表示用户输入的结束' (重要的是,因为,即使我的教授错了,也可以说如果他特意告诉我们,我应该采用他的标准。但他并没有告诉我们。) 在用户输入中使用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,我试图完成的是无意中禁止的(也就是接收输入,检查它,可能会收到更多输入)。
答案 0 :(得分:6)
正确使用EOF(可以在程序中多次使用吗?)
没有单一的EOF。每个输入流都有一个EOF。
如果您正在从文件中读取文件,则可以在{E范围到达EOF时重置std::ifstream
的状态,以便再次读取该文件的内容。
但是,如果您正在阅读std::cin
的数据,则一旦达到EOF,您就无法再从std::cin
开始阅读。
在您的课程中,您的教授是对的。他们最有可能在谈论从std::cin
阅读。
答案 1 :(得分:1)
根据我的判断,
EOF
被简单地定义为当前文件的结尾。
是的。请注意,特别是,它并不意味着自动启动新文件。
虽然您的系统可能会让您继续从同一个文件中读取它来自TTY的特定情况,但由于EOF
在那里伪造,您通常不应该依赖它。试试program </dev/null
,看看当你尝试自动化程序时就会发生。