C++ std :: istream readsome不会读取任何内容

Sam*_*son 7 c++ fstream istream

就像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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

好吧,流看起来不错.0:L

Pot*_*ter 9

咨询参考,

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

简而言之,readsome至少对于标准流而言是相当无用的.这是一个超级非阻塞读取:它只会加载已在用户级进程中缓冲的数据,并且它不会进行内核调用.


pax*_*blo 6

auto ssize = stream.readsome(&justOneChar, 1);
Run Code Online (Sandbox Code Playgroud)

1是要读取的最大字符数.如果在调用它时内部缓冲区是空的,那么你将返回零作为返回值.

以下引用(以我的粗体显示)显示了这个方面:

streamsize readsome (char* s, streamsize n);

n从流中提取最多字符并将它们存储在指向的数组中s,一旦相关的流缓冲区对象(如果有)保留的内部缓冲区用完字符就停止,即使文件结束还没有已达成.

该函数用于从某些类型的异步源读取数据,这些数据可能最终等待更多字符,因为它会在内部缓冲区耗尽时停止提取字符,从而避免潜在的延迟.

它基本上是一种获取尽可能多的字符(受指定限制)的方法,而不必等待流提供更多.