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

时间:2014-11-24 05:33:06

标签: 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;
}

输出:

嗯,溪流看起来不错。 0:L

3 个答案:

答案 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函数。