从stdin读取特定数量的字符

时间:2011-05-19 16:51:17

标签: c++ file file-descriptor

HI

我正在编写一个充当服务器的程序,并且能够通过终端与用户进行交互。如果我从标准输入读取我想要多达140个字符。 如果用户输入的数量超过140,我只想采用前140个字符而忽略其余字符。

我尝试类似下面的代码:

struct timeval timeout;
fd_set readings;
char buf[140];


while (1) {
    timeout.tv_sec = 15;
    timeout.tv_usec = 0;
    FD_ZERO(&readings);
    FD_SET(STDIN_FILENO,&readings);

    int rv = select(STDIN_FILENO+1,&readings,NULL,NULL,&timeout);
    if (rv<0) {
        cout << "ERROR select\n";
        exit(1);
    }
    if (rv==0) {
        cout << "Still Waiting...\n";
    }
    else {
        cout << "A key was pressed\n";
        if (FD_ISSET(STDIN_FILENO,&readings)) {
            int num = read(STDIN_FILENO,&buf,140);
            buf[num]='\0';
            cout << buf << endl;
        }
    }
}

问题是 - 当我输入140个以上的字符时,会打印前140个字符,但是read()会在下一次迭代中读取剩余的数据并打印出来。 如何清除标准输入以便在下一次迭代中忽略其余数据?

谢谢!!

4 个答案:

答案 0 :(得分:2)

您可以修改解决方案以使用readsome()

char c[140];
cin.readsome(&c[0], 140);

或保留您拥有的内容并使用ignore

答案 1 :(得分:1)

几乎唯一的选择是阅读字符并将其丢弃,直到达到行尾。

答案 2 :(得分:0)

读取指针中的所有输入文本,然后提取前140个字符,然后再次删除指针以准备好下一个请求。

答案 3 :(得分:0)

你为什么不这样做:

char buf[256];//what ever
...
int num = read(STDIN_FILENO,&buf,256);
if (num > 140) num = 140;
buf[num]='\0';
cout << buf << endl;