【问题标题】:Keep asking for input and reopen stdin继续要求输入并重新打开标准输入
【发布时间】:2020-12-10 21:39:10
【问题描述】:

我的任务是创建一个对数字向量进行一些计算的程序。向量中必须至少包含 1 个数字,如果没有,我必须抛出异常并重试。这里有一个视频示例代码应该如何工作:https://asciinema.org/a/283343

我猜测 EOF 正在使用 CTRL+D 发出信号,这就是引发异常的原因。 如果他们使用 Enter(新行),它会留下一个空行。 但就我而言,在我按下 CTRL+D 后,我的程序只是在无限循环中运行,因为尽管我使用了 cin.clear(),但标准输入仍处于失败状态。

是否有另一个类似于 CTRL+D 的快捷方式可以用于此目的,或者有没有办法重新打开流,或重新启动整个应用程序。

当我使用 CTRL+Z 时,该程序在 Windows 上运行良好,但在 Linux 上我无法让它正常工作。

示例代码如下:

#include<iostream>
#include<vector>

void enter_elements(std::vector<double>& input_list){
    double x;
    std::cout << "Enter numbers: " << std::endl;
    while(std::cin >> x){
        input_list.push_back(x);
    }
    if(input_list.empty()){
        throw std::string("You must enter at least 1 number!");
    }

}

int main(){
    std::vector<double> input_list;

    try {
    enter_elements(input_list);
    } catch (const std::string& e) {
        std::cout << "Error: " << e << std::endl;
        std::cin.clear();
        enter_elements(input_list);
    }
    return 0;
}

谁能帮我解决这个问题或建议我可以在哪里阅读更多相关信息?

【问题讨论】:

  • 我想到了两件事:首先,这似乎不是一个很好的异常用例;第二件事是您可能希望使用特殊的哨兵输入来标记输入的结尾而不是文件结尾。
  • 哦,第三件事:您可能想在循环中调用enter_elements,直到向量非空。现在你只尝试了两次。
  • 我正在考虑调用 main() 而不是 enter_elements(list) 这样我就可以基本上“重新启动”我的程序了。
  • 哦,你不能那样做。在 C++ 中禁止自己调用main,这会导致未定义的行为。如果你想要一个循环,请使用一个实际的循环。

标签: c++ stdin eof


【解决方案1】:

没有。

一旦流关闭,流就关闭了。就是这样。

我要做的是在一行中接受一组数字。您的输入迭代将在行尾结束。然后验证这些数字,并在必要时要求换行。

您可以通过循环 std::getline 而不是使用格式化提取来做到这一点。然后你需要解析你得到的行。

这不是视频显示的内容,但我不知道他们是如何做到的。也许你应该问他们!

【讨论】:

    【解决方案2】:

    您是在问如何停止程序吗?
    如果是这样,在 linux 上,您应该在程序运行时尝试 CTRL+C 而不是 CTRL+DCTRL+Z

    【讨论】:

      【解决方案3】:

      这就是我讨厌使用 cin >> anInt 的原因。我更喜欢 getLine 并自己解析它。然后你可以让它做任何事情并决定你将如何确定列表的结尾等。

      是的,这是更多的代码。但是你不会遇到这样奇怪的问题。

      【讨论】:

      • 我试着走那条路,但是,当我发出 CTRL+D 信号时,即使在使用 std::cin.ignore() 之后,std::cin 仍处于失败状态,并且程序进入一个无限循环..
      • 是的,这就是为什么你会想要一种不同的方式来结束你的输入——比如一个空行。
      猜你喜欢
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      相关资源
      最近更新 更多