C ++中的std :: istream readsome没有读取任何内容

10

好像 readsome 根本没有读取任何内容。它返回 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

3个回答

11

咨询参考资料

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

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


8
auto ssize = stream.readsome(&justOneChar, 1);
1 是最多可读取的字符数。如果在调用此功能时流的内部缓冲区为空,则返回零。
以下摘录(我的加粗)显示了此方面的内容:
streamsize readsome(char* s, streamsize n); 从流中提取最多n个字符,并将它们存储在由s指向的数组中,当关联的流缓冲区对象(如果有)的内部缓冲区耗尽字符时停止,即使尚未达到文件结束符。
该函数旨在用于从某些类型的异步源读取数据,这些源可能最终等待更多字符,因为它会在内部缓冲区耗尽字符时立即停止提取字符,避免潜在的延迟。
基本上,这是一种在不必等待流提供更多内容的情况下获取尽可能多字符(受限于您指定的限制)的方法。

1
它无法工作是因为在那一刻可能没有可供读取的字符。正如有人提到的,它作为非阻塞读取函数工作,因此这意味着它不等待输入,这就是为什么它不会要求您进行输入的原因。因此,为了成功读取任何内容,必须在底层缓冲区中有可用的内容。
要查看下一次调用readsome可以提取的字符数,请使用in_avail函数。

2
in_avail 避免返回零,因此它无法可靠地告诉您 readsome 不会返回任何字符。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接