【问题标题】:C++ cin.get(), cin.peek() pausing, same with stdioC++ cin.get(), cin.peek() 暂停,和 stdio 一样
【发布时间】:2012-11-01 08:58:47
【问题描述】:

这是我目前的代码。这段代码咳出了 cin.get() 上的错误。我知道这不是好的代码,它不应该是,我只是在测试一些 cin 的东西。

#include <string>
#include <iostream>
#include <stdio.h>

using namespace std;

int main(){
    char c[1000];
    cin.setstate(cin.eofbit);
    cout << cin.good() << endl;
    cout << cin.eof() <<endl;
    cout << cin.get() << endl;
    cin.putback('c');
    cout << cin.get() << endl;
    cout << "Do we ever reach this?" << endl;
    while(1){
    };
    return 0;
}

无论如何。我的问题是 cin.get()、cin.peek()、cin.ignore()、getchar() 或几乎任何您可以命名的 cin 或 stdio 函数,当流为空时暂停我的程序的执行,无需设置EOF 位或任何东西。这对我来说很烦人,因为我想检查流中是否有任何东西以便我可以清除它,因为 ignore() 总是暂停。

我可以开始工作的唯一方法是“istream::readsome”。我已经将它加载到一个 char 数组中并使用 cout 打印它。它会打印一长串我不认识的符号(每个符号都是一个单独的符号)。

http://gyazo.com/e3ee65cdad7ed5cc7b2ce2307ca58c90

转换为整数,结果为 -52,不等于 ASCII 或 Unicode 中的任何内容。

我正在使用 Visual C++ Express 2010 进行编译。

请帮忙,我现在完全被难住了。我只是想读取字符/刷新我的流,如果没有任何内容,则无需暂停。我花了 3 个小时试图解决这个问题。叹息。

【问题讨论】:

  • sync() 丢弃缓冲区中剩余的任何内容,但不能保证这种行为。
  • 谢谢,我去看看。但是,如果我执行 cin.ignore 或 cin.peek,是否有任何保证的方法或防止可怕的暂停的方法?
  • OTOH,通过正确检查您的 I/O 操作的结果,您永远不会到不知道流是否为空的地步。
  • 但我不确定如何正确检查是否无法在不意外暂停程序的情况下检查流中剩余的内容。另外,它仍然应该设置 EOF 位,不是吗?这只是没有设置。
  • 要从控制台设置 EOF 位,请键入 Ctrl + Z

标签: c++ get wait cin istream


【解决方案1】:

要删除所有已知可用的字符,您可以将std::istream::ignore()std::streambuf::in_avail() 结合使用:

std::cin.ignore(std::cin.rdbuf()->in_avail());

但是,我想这并不能真正做到您想要的:标准流对象只是读取操作系统提供给它们的任何内容。通常,连接到某种控制台窗口的输入的默认模式是对输入进行行缓冲。真正传递给流的字符数量几乎是不确定的。

要检查输入流上是否有可用的输入,您需要使用平台特定的方法。标准 C++ 库不提供任何非阻塞检查以查看新数据是否到达 std::cin。在 POSIX 系统上,您可以使用 poll() 和文件描述符 0 来查看 std::cin 是否有任何数据。我不知道非 POSIX 系统需要什么。

【讨论】:

  • 我在这个问题上摆弄了一下。 IN_avail 始终返回 1,无论我将多少个字符放入 cin。这。清除它的唯一方法是使用同步()。加上ignore决定暂停事情,叹息。不过感谢您的回复,我会继续寻找能够在 Windows 中检查它的东西
  • @user1819357 你找到在 Windows 上检查的方法了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
相关资源
最近更新 更多