2014-11-24 111 views
5

这就像readsome甚至没有读取。返回0并且不读取任何字符。这里有什么问题?C++ std :: istream readsome不读取任何东西

#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

回答

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

1最大数目要读取的字符。如果在您调用流时内部缓冲区为空,您将得到零回调作为返回值。一旦从由s指向的数组中的数据流,并将它们存储

streamsize readsome (char* s, streamsize n);

提取物最多n字符,停止

以下引号(与我的粗体)示出了该方面即使尚未到达文件结尾,由关联的流缓冲区对象(如果有)保留的内部缓冲区也会耗尽字符。

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

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

7

咨询a reference

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

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

1

它不起作用,因为在那个时刻可能没有任何字符可供阅读。它可以像其他人提到的那样作为非阻塞式读取函数工作,因此这意味着它不会等待输入,这就是为什么它不会要求输入。因此,为了让您使用它来成功读取任何内容,底层缓冲区中必须有可用的内容。

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

+2

'in_avail'避免返回零,因此它不能可靠地告诉你'readsome'不会返回任何字符。 – Potatoswatter 2014-11-24 06:02:29