gpt4 book ai didi

c++ - 为什么在空流上调用时 std::istream::ignore 不返回?

转载 作者:行者123 更新时间:2023-11-27 22:42:58 30 4
gpt4 key购买 nike

std::cin 是一个全局对象,因此我总是想在使用它之前将其设置为良好状态。但是,当在未使用的 cin 上调用 ignore() 时,该函数不会返回。

请参阅下面的示例代码。如果没有用户干预,执行不会到达第 8 行 (cout)。在我的测试中,此行为与第二个参数(定界符,我试过 '\n' 和 EOF)一致或不一致。

我浏览了一些在线引用资料,但我不明白为什么会这样。

#include <limits>
#include <iostream>
#include <string>
std::string readInput() {
std::string input = "";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "We never get here..." << std::endl;
std::getline(std::cin, input);
return input;
}
int main() {
std::string foo = readInput();
}
  1. 为什么在这种情况下 ignore() 没有返回?
  2. 如何在 使用之前安全地重置和清空 std::cin?

最佳答案

参见第二个参数'\n'。您请求读取'\n' 之前的字符并忽略它们。由于流中没有 '\n',这意味着阻塞直到收到一个。

希望很清楚,您应该只在知道流上有 '\n' 时才进行此调用。

因此,第二个问题的答案是,在使用之前,什么都不做,因为无论如何流中都没有数据。

清除流的时间是从流中读取一些数据之后;然后根据你使用的读操作,你会知道是否有换行符。

请注意,没有“清除流中的任何内容”这样的操作(这是有意设计的)。相反,您的操作将是“清除行的其余部分”之类的操作,其中“行”被定义为直到下一个换行符;并且输入将来自使用行的文件或用户按 Enter 的交互式终端。

关于c++ - 为什么在空流上调用时 std::istream::ignore 不返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46583006/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com