istream :: readsome不能从控制台读取?

时间:2014-10-11 11:37:25

标签: c++ ifstream

我已经编写了上面的代码来测试" readsome" 。当"读"使用代码工作,但需要等待输入0x10字符才能工作。 随着" readome"在我的系统上没有读取任何内容(ubuntu Linux 3.13.0-37)。 为什么?

#include <iostream>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{   std::setlocale(LC_CTYPE, "");std::locale::global(std::locale(""));
    char s[0x11];int i=150;
    do{
        s[0]=0;
        std::cin.readsome(s,0x1);
        if(std::cin.gcount()>0)
            s[std::cin.gcount()]=0;
            if(std::cin.eof()) std::cout<<"EOF!"<<std::endl;
            std::cout<<s;
        usleep(100000);
    }while(i--);
    std::cin.read(s,0x10);
    std::cout<<s<<std::endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

根据http://en.cppreference.com/w/cpp/io/basic_istream/readsome &#34;此功能的行为高度针对特定于实现。例如,当与std :: ifstream一起使用时,一旦文件被打开,一些库实现就会用数据填充底层的filebuf(并且这些实现上的readsome()读取数据,可能但不一定是整个文件),而其他实现仅在请求实际输入操作时从文件读取(并且在文件打开后发出的readsome()从不提取任何字符)。同样,对std :: cin.readsome()的调用可能会返回所有未处理的未处理控制台输入,或者可能始终返回零并且不提取任何字符。&#34;

所以linux控制台案例中的readome似乎完全没用。 (如果某个团体知道不同的东西请告知)。

答案 1 :(得分:0)

readsome仅提取缓冲区中的字符。它不会等待任何输入。 从标准([istream.unformatted] / 32):

  

如果rdbuf()->in_avail() == -1,请致电setstate(eofbit) [...],和   不提取任何字符;    - 如果rdbuf()->in_avail() == 0,则不提取字符
- 如果   rdbuf()->in_avail() > 0,摘录min(rdbuf()->in_avail(),n))