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

istream::readsome doesn't read from console?

本文关键字:读取 控制台 readsome istream      更新时间:2023-10-16

我已经编写了上面的代码来测试"readsome"。当使用"read"时,代码可以工作,但需要等待0x10字符的输入工作。使用"readsome",我的系统上什么都不会读取(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;
}

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

因此,在 linux 控制台案例中阅读似乎完全没用。(如果有人知道不同的事情,请告知(。

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

如果rdbuf()->in_avail() == -1,则调用setstate(eofbit) [...],并且 不提取任何字符; — 如果rdbuf()->in_avail() == 0,则不提取任何字符
— 如果 rdbuf()->in_avail() > 0,摘录min(rdbuf()->in_avail(),n))