C++ istream::readsome不';你不能从控制台读吗?

C++ istream::readsome不';你不能从控制台读吗?,c++,ifstream,C++,Ifstream,我编写了上面的代码来测试“readsome”。使用“读取”时,代码可以工作,但需要等待0x10字符的输入才能工作。 使用“readsome”时,我的系统(ubuntu Linux 3.13.0-37)上不会读取任何内容。 为什么? #包括 #包括 #包括 int main(int argc,字符**argv) {std::setlocale(LC_CTYPE,“”);std::locale::global(std::locale(“”); 字符s[0x11];int i=150; 做{ s[0]

我编写了上面的代码来测试“readsome”。使用“读取”时,代码可以工作,但需要等待0x10字符的输入才能工作。 使用“readsome”时,我的系统(ubuntu Linux 3.13.0-37)上不会读取任何内容。 为什么?

#包括
#包括
#包括
int main(int argc,字符**argv)
{std::setlocale(LC_CTYPE,“”);std::locale::global(std::locale(“”);
字符s[0x11];int i=150;
做{
s[0]=0;
标准::cin.readsome(s,0x1);
if(std::cin.gcount()>0)
s[std::cin.gcount()]=0;

如果(std::cin.eof())std::cout
readsome
只提取缓冲区中已经存在的字符。它不会等待任何输入。 根据标准([istream.unformated]/32):

如果
rdbuf()->in_avail()==-1
,则调用
setstate(eofbit)
[…],并 不提取字符; -如果
rdbuf()->in_avail()==0
,则不提取字符
-如果
rdbuf()->在_avail()>0中
,提取
min(rdbuf()->在_avail(),n中)

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


因此,linux控制台案例中的readsome似乎毫无用处。(如果有人知道一些不同的信息,请告知).

我很好奇:你认为
read
readsome
之间的区别是什么?如果readsome从控制台读取可用数据而不等待收集所有数据,而read则等待指定的字符数,这将是非常有用的。是的,这就是发生的情况。定义“所有数据”-你的计算机程序看不到未来!我的问题是,我要在缓冲区中输入数字字符,我按了回车键,但没有任何内容是“可读的”.是的,但是你调用
readsome
,然后将内容输入控制台。正如我在回答中提到的,readsome不会等待输入,因此你在控制台中写入的任何内容都将被丢弃。不,我调用readsome,在我调用sleep(1)之后,它将不读取任何内容它会一次又一次地等待1秒,直到我写入字符并点击回车键,此时readsome应该会找到输入的数据,但它没有。你知道你输入控制台的字符甚至没有放入任何缓冲区吗?我的意思是,在什么时候进行了提取?输入控制台的字符,应该进入cin。
#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;
}