我使用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
从未读过任何内容。我错过了什么?
答案 0 :(得分:3)
请参阅cppreference,尤其是“备注”。
此功能的行为是高度特定于实现的。例如,当与
std::ifstream
一起使用时,一旦文件被打开,一些库实现就会为基础filebuf
填充数据(并且这些实现上的readsome()
会读取数据,但可能会但不一定,整个文件),而其他实现仅在请求实际输入操作时从文件读取(并且在文件打开后发出readsome()
从不提取任何字符)。同样,对std::cin.readsome()
的调用可能会返回所有未处理的未处理控制台输入,或者可能始终返回零并且不提取任何字符。
但是,如果我尝试使用:
std::cin >> buffer.data();
然后我可以提取控制台输入。为了获得您正在寻找的行为,我会使用std::istream::get()
,并检查while循环中的eof
和fail
位。
答案 1 :(得分:0)
readsome()在其缓冲区耗尽时终止,以避免延迟。如果您在执行时没有等待呼叫的数据,则它不会读取任何内容。它不会等你。