就像读物根本就没读一样。返回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
发布于 2014-11-24 05:36:17
auto ssize = stream.readsome(&justOneChar, 1);
1
是要读取的最大字符数。如果调用流内部缓冲区是空的,则返回零作为返回值。
下面的引文(用我的粗体)显示了这个方面:
streamsize readsome (char* s, streamsize n);
从流中提取n
字符,并将它们存储在s
指向的数组中,在关联的流缓冲区对象(如果有的话)保存的内部缓冲区用完字符时立即停止,即使尚未到达文件结束。 该函数用于从某些类型的异步源读取数据,这些异步源最终可能等待更多的字符,因为一旦内部缓冲区耗尽,它就停止提取字符,从而避免潜在的延迟。
这基本上是一种获得尽可能多的字符的方法(受您指定的限制),而不必等待流提供更多的字符。
发布于 2014-11-24 05:41:16
咨询参考文献,
此函数的行为是高度特定于实现的。例如,当与
std::ifstream
一起使用时,一些库实现在打开文件后立即用数据填充底层的filebuf
(并且在这些实现上的readsome()
可能读取数据,但不一定读取整个文件),而其他实现只在请求实际输入操作时才从文件中读取数据(文件打开后发出的readsome()
从不提取任何字符)。同样,对std::cin.readsome()
的调用可能会返回所有挂起的未处理控制台输入,或者总是返回零,并且不提取字符。
简而言之,readsome
是相当无用的,至少对于标准流来说是这样。这是一个超级非阻塞读取:它将只加载用户级进程中缓冲的数据,并且永远不会进行内核调用。
发布于 2014-11-24 05:54:48
它不工作,因为可能没有任何字符可供阅读在那一刻。正如有人提到的那样,它作为一个非阻塞的读取函数工作,因此这意味着它不会等待输入,这就是为什么它没有要求您输入。因此,要使用它成功地读取任何内容,必须在基础缓冲区中有可用的内容。
要查看在下一次对readsome的调用中可以提取的字符数,请使用起效函数。
https://stackoverflow.com/questions/27098420
复制相似问题