2014-10-02 167 views
1

這是以下代碼應該做的事情。它應該讀取已被用戶輸入到int中的流(稱爲lineStream)中的信息。數據要麼是一個單一的數字,要麼是「全部」。如果它不是,我應該通知用戶這是一個錯誤。爲什麼我的stringstream爲空?

雖然這是會發生的事情:當用戶輸入數字時,一切正常。當他輸入單詞「all」時,流失敗(因爲我正在將它讀入int)。當發生這種情況時,我嘗試將流中的信息讀入一個字符串(「stringstream」)並檢查用戶是否輸入了「all」。但是,即使用戶輸入「全部」,當我嘗試從失敗後讀取它時,流只輸出「」(空字符串)。有誰知道爲什麼?謝謝。

int nameofnode; 

lineStream >> nameofnode; 

if (lineStream.fail()) 
{ 
    string streamString; 
    lineStream >> streamString; 

    if (streamString == "all") { 

     if (lineStream.peek() != EOF) { //Too many arguments 
      cout << "Error: too many arguments\n"; 
      return; 
     } 

     cout << "Print: all nodes\n"; 
    } 
    else 
    { 
     cout << "Error: Invalid argument"; 
    } 

    return; 
} 
+2

流仍處於失敗狀態,在重試提取字符串而不是-int提取字符串之前,您從未清除該字符串。 – WhozCraig 2014-10-02 02:32:58

+0

@WhozCraig如果流處於失敗狀態,這是否意味着我無法讀取它?我認爲這只是意味着我不能使用它的任何功能。 – dfg 2014-10-02 02:33:44

+2

直到失敗狀態被清除,你不能用iostream做很多*任何事情。如果不是「使用它的任何功能」,你認爲「從中讀取」是什麼?提取'operator >>'只是使用流成員從流中提取格式化數據的前端。很確定,在你的字符串嘗試之前,你正在尋找調用[** clear()**](http://en.cppreference.com/w/cpp/io/basic_ios/clear)的方法。 – WhozCraig 2014-10-02 02:36:20

回答

2

一旦進入失敗狀態,就可以無所事事地用iostream進行處理,而無需以某種方式清除失敗狀態。在這種情況下..

int nameofnode; 

if (!(lineStream >> nameofnode)) 
{ 
    lineStream.clear(); // <<==== HERE 

    string streamString; 
    if (lineStream >> streamString && streamString == "all") { 

     if (lineStream.peek() != EOF) { //Too many arguments 
      cout << "Error: too many arguments\n"; 
      return; 
     } 

     cout << "Print: all nodes\n"; 
    } 
    else 
    { 
     cout << "Error: Invalid argument"; 
    } 

    return; 
} 
+0

感謝您的幫助 – dfg 2014-10-02 02:46:35