std :: cin.readsome总是读取0个字节

时间:2014-07-11 14:50:53

标签: c++ iostream

我使用C ++代码并使用辅助工具pv(管道查看器)进行了简单的测试。 代码是:

#include <iostream>
#include <array>

int main() {
    std::array<char,4096> buffer;
    while( true ) {
        std::cin.readsome(buffer.data(),4096);
    }
}

我执行:

pv /dev/urandom | ./a.out

通过pv,我注意到readsome从未读过任何内容。我错过了什么?

2 个答案:

答案 0 :(得分:3)

请参阅cppreference,尤其是“备注”。

  

此功能的行为是高度特定于实现的。例如,当与std::ifstream一起使用时,一旦文件被打开,一些库实现就会为基础filebuf填充数据(并且这些实现上的readsome()会读取数据,但可能会但不一定,整个文件),而其他实现仅在请求实际输入操作时从文件读取(并且在文件打开后发出readsome()从不提取任何字符)。同样,对std::cin.readsome()的调用可能会返回所有未处理的未处理控制台输入,或者可能始终返回零并且不提取任何字符。

但是,如果我尝试使用:

std::cin >> buffer.data();

然后我可以提取控制台输入。为了获得您正在寻找的行为,我会使用std::istream::get(),并检查while循环中的eoffail位。

答案 1 :(得分:0)

readsome()在其缓冲区耗尽时终止,以避免延迟。如果您在执行时没有等待呼叫的数据,则它不会读取任何内容。它不会等你。