C ++ cin.get(),cin.peek()暂停,与stdio相同

时间:2012-11-12 21:49:03

标签: c++ get wait cin istream

这是我目前的代码。此代码咳嗽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个小时试图解决这个问题。叹息。

1 个答案:

答案 0 :(得分: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系统上需要什么。