2011-05-19 123 views
1

從標準輸入讀取特定數量的字符

我正在編寫一個程序,充當服務器並且能夠通過終端與用戶交互。如果我從stdin中讀取我想要達到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個字符被印刷,但後來讀取()讀取數據的其餘部分在下一次迭代並打印它。 如何清除stdin,以便在下一次迭代中忽略其餘數據?

謝謝!

回答

1

幾乎唯一的選擇是讀取字符並丟棄它們,直到達到行尾。

2

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

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

或者保持你所擁有和使用ignore

0

閱讀所有輸入文本的指針,然後抽取第140個字符,然後再刪除該指針,以準備下一個請求。

+0

我如何讀取數據的指針的未知量未分配空間來存放呢? – 2011-05-19 17:00:29

+0

您可以獲取輸入流的寬度,重新分配寬度爲+1的字符的指針變量,然後將輸入流讀入de指針。 – 2011-05-19 17:34:24

0

你爲什麼不去做這樣的事情:

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