像readome甚至不读。返回0并且不读取任何字符。这有什么不对?
#include <fstream>
#include <iostream>
int main ()
{
std::fstream stream("list.cpp", std::ios::in);
if (stream.good() || !stream.bad() || stream.is_open()) {
std::cout << "Well, stream looks good." << std::endl;
char justOneChar = 'L';
auto ssize = stream.readsome(&justOneChar, 1);
std::cout << ssize << " : " << justOneChar << std::endl;
}
return -1;
}
输出:
嗯,溪流看起来不错。 0:L
答案 0 :(得分:9)
咨询a reference,
此功能的行为是高度特定于实现的。例如,当与
std::ifstream
一起使用时,一旦文件被打开,一些库实现就会为基础filebuf
填充数据(并且这些实现上的readsome()
会读取数据,但可能会但不一定,整个文件),而其他实现仅在请求实际输入操作时从文件读取(并且在文件打开后发出readsome()
从不提取任何字符)。同样,对std::cin.readsome()
的调用可能会返回所有未处理的未处理控制台输入,或者可能始终返回零并且不提取任何字符。
简而言之,readsome
相当无用,至少对标准流来说是这样。这是一个超级非阻塞读取:它只会加载已经在用户级进程中缓冲的数据,并且它不会进行内核调用。
答案 1 :(得分:6)
auto ssize = stream.readsome(&justOneChar, 1);
1
是最大要读取的字符数。如果在调用它时内部缓冲区是空的,那么你将返回零作为返回值。
以下引用(以我的粗体显示)显示了这一方面:
streamsize readsome (char* s, streamsize n);
从流中提取最多
n
个字符,并将它们存储在s
指向的数组中,并在相关的流缓冲区对象(如果有)保留内部缓冲区时立即停止即使尚未到达文件结尾,也会耗尽字符。该函数用于从某些类型的异步源读取数据,这些数据可能最终等待更多字符,因为它会在内部缓冲区耗尽时停止提取字符,从而避免潜在的延迟。
这基本上是一种获取尽可能多的字符(受指定限制)的方法,而不必等待流提供更多。
答案 2 :(得分:1)
它不起作用,因为在那一刻可能没有任何可供阅读的字符。它可以像有人提到的那样用作非阻塞读取功能,因此这意味着它不会等待输入,这就是为什么它不会要求您输入。因此,要使用它来成功读取任何内容,底层缓冲区中必须有一些可用的东西。
要查看下次调用readome时可以提取的字符数,请使用in_avail函数。