2

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

4

1 回答 1

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 系统需要什么。

于 2012-11-12T22:00:01.170 回答