首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ std::istream readsome什么也不读

C++ std::istream readsome什么也不读
EN

Stack Overflow用户
提问于 2014-11-24 05:33:05
回答 3查看 6.9K关注 0票数 9

就像读物根本就没读一样。返回0并且不读取任何字符。这里怎么了?

代码语言:javascript
运行
复制
#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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-24 05:36:17

代码语言:javascript
运行
复制
auto ssize = stream.readsome(&justOneChar, 1);

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

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

streamsize readsome (char* s, streamsize n); 从流中提取n字符,并将它们存储在s指向的数组中,在关联的流缓冲区对象(如果有的话)保存的内部缓冲区用完字符时立即停止,即使尚未到达文件结束。 该函数用于从某些类型的异步源读取数据,这些异步源最终可能等待更多的字符,因为一旦内部缓冲区耗尽,它就停止提取字符,从而避免潜在的延迟。

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

票数 7
EN

Stack Overflow用户

发布于 2014-11-24 05:41:16

咨询参考文献

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

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

票数 11
EN

Stack Overflow用户

发布于 2014-11-24 05:54:48

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

要查看在下一次对readsome的调用中可以提取的字符数,请使用起效函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27098420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档