【问题标题】:Cin doesn't pause for input, despite using both cin.clear() and cin.ignore()尽管同时使用了 cin.clear() 和 cin.ignore(),但 Cin 不会暂停输入
【发布时间】:2017-10-06 04:10:59
【问题描述】:

此输入从文件重定向到 unix 终端中的可执行文件:

10 1 2 3 4 5 6 7 8 9 10
5 10 20 30 40 50

Cin 不等待输入,即使它似乎处于良好状态。

int main(void) {
    std::cout << "GOOD: " << std::cin.good() << std::endl
              << "EOF: " << std::cin.eof() << std::endl
              << "FAIL: " << std::cin.fail() << std::endl
              << "BAD: " << std::cin.bad() << "\n\n";
    int s;
    while(std::cin >> s) {
            int * arr = new int[s];
            for(int i = 0; i < s; i++) {
                    std::cin >> arr[i];
                    std::cout << arr[i] << " ";
            }
            std::cout << "\n\n";
            delete[] arr;
    }

    std::cout << "CAN READ: " << (bool)(std::cin >> s) << std::endl
              << "GOOD: "<< std::cin.good() << std::endl
              << "EOF: "<< std::cin.eof() << std::endl
              << "FAIL: "<< std::cin.fail() << std::endl
              << "BAD: "<< std::cin.bad() << "\n\n";

    std::cin.clear();
    std::cin.ignore(INT_MAX);

    std::cout << "GOOD: " << std::cin.good() << std::endl
              << "EOF: " << std::cin.eof() << std::endl
              << "FAIL: " << std::cin.fail() << std::endl
              << "BAD: " << std::cin.bad() << "\n\n";

    std::cin.clear();

    std::cout << "GOOD: " << std::cin.good() << std::endl
              << "EOF: " << std::cin.eof() << std::endl
              << "FAIL: " << std::cin.fail() << std::endl
              << "BAD: " << std::cin.bad() << "\n\n";

    std::cout << "Enter a #:\n";
    std::cin >> s; // unable to provide input (EDIT: from keyboard) here
    std::cout << s << std::endl; 

    std::cout << "Program ends.\n";
    return 0;
}

输出是

GOOD: 1
EOF: 0
FAIL: 0
BAD: 0

1 2 3 4 5 6 7 8 9 10 

10 20 30 40 50

CAN READ: 0
GOOD: 0
EOF: 1
FAIL: 1
BAD: 0

GOOD: 0
EOF: 1
FAIL: 0
BAD: 0

GOOD: 1
EOF: 0
FAIL: 0
BAD: 0

Enter a #:
5
Program ends.

我在这里缺少什么?为什么即使它的缓冲区为空且流处于良好状态,cin 也不允许我为其提供输入?我该怎么做才能让 cin 在这里接受进一步的输入?

【问题讨论】:

  • cin 被重定向到文件...当文件被读取到最后时,您想如何提供来自文件的输入?

标签: c++ cin


【解决方案1】:

认为在将文件重定向到 cin 后可以无缝获取键盘输入(感谢 Artemy Vysotsky 帮助我意识到情况并非如此)。

对于任何有类似问题的人,都可以使用 std::cin.rdbuf()。详情在这里:Can std::cin switch from accepting file input to keyboard input at run-time?

【讨论】:

    【解决方案2】:

    使用 cin.flush();输入一个整数后。它将刷新流,您可以再次输入字符串。 如果你想知道为什么会这样,可以阅读here

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 2011-11-16
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2016-08-03
      • 1970-01-01
      相关资源
      最近更新 更多