【问题标题】:C++ std::istream readsome doesn't read anythingC++ std::istream readsome 不读取任何内容
【发布时间】:2014-11-24 05:33:05
【问题描述】:

这就像 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

【问题讨论】:

    标签: c++ fstream istream


    【解决方案1】:

    咨询a reference,

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

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

    【讨论】:

      【解决方案2】:
      auto ssize = stream.readsome(&justOneChar, 1);
      

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

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

      streamsize readsome (char* s, streamsize n);

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • in_avail 避免返回零,因此它无法可靠地告诉您readsome 不会返回任何字符。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-15
        • 2010-12-21
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 2014-12-29
        相关资源
        最近更新 更多