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

C++ std::istream readsome doesn't read anything

本文关键字:读取 任何内 readsome std istream C++      更新时间:2023-10-16

就像读书甚至没有读书一样。返回 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

查阅参考资料,

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

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

auto ssize = stream.readsome(&justOneChar, 1);

1是要读取的最大字符数。如果流内部缓冲区在调用时为空,则将返回零作为返回值。

以下引用(加粗)显示了这一方面:

streamsize readsome (char* s, streamsize n);

从流中提取多达 n 个字符并将它们存储在 s 指向的数组中,一旦关联的流缓冲区对象(如果有)保留的内部缓冲区的字符用完,即使尚未到达文件末尾,也会立即停止。

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

这基本上是一种获取尽可能多的可用字符(受您指定的限制)的方法,而无需等待流提供更多字符。

它不起作用,因为当时可能没有任何字符可供阅读。正如有人提到的那样,它用作非阻塞读取函数,因此这意味着它不会等待输入,这就是为什么它没有要求您输入的原因。因此,要使用它成功读取任何内容,基础缓冲区中必须有一些可用内容。

若要查看在下次调用 readsome 时可以提取的字符数,请使用 in_avail 函数。