2011-06-20 85 views
1

我碰到這在我讀出來......使用CIN >>錯誤處理

while(!(std::cin >> array[i])) 
{ 
std::cin.clear(); 
while(std::cin.get()!= '\n') 
continue; 
std::cout << "enter a new input: "; 
} 

而且,我真的不明白的錯誤處理是如何工作的。使用std::cin.clear(),但代碼繼續從下一行中的cin對象獲取字符,然後使用continue語句。如果沒有清除cin,clear會幹什麼?謝謝。

回答

1

做什麼cin.clear()是清除CIN流的錯誤flags.When它不使用這個CIN流操作可以continue.the下一行從流中提取字符並將其返回。 要理解循環確實考慮以下情況:

假設數組的類型爲int,並且輸入:abc,然後按Enter鍵。 cin標識字符串輸入無法進入int數組。所以它返回false並設置錯誤標誌。當你執行cin.clear()它會重置錯誤標誌,以便進一步的操作可以繼續(cin.get()可以工作)。現在cin.get()從流。因爲它不等於'\ n'循環繼續(第二循環),直到它提取'\ n'=>這意味着你剛剛輸入的錯誤的i/p全部沖走你可以重新開始

+0

作爲替代方案可以在cin.clear之後使用cin.ignore(val,'\ n'),其中val足夠高以刷新I/P流 – jemmanuel

3

.clear()清除cin中的錯誤標誌。例如,如果輸入無法轉換,它們會被設置。在設置任何錯誤標誌時,從cin中提取輸入將自動失敗。

1

clear函數爲錯誤控制狀態設置一個新值。

考慮下面的例子:

// clearing errors 
#include <iostream> 
#include <fstream> 
using namespace std; 

int main() { 
    char buffer [80]; 
    fstream myfile; 

    myfile.open ("test.txt",fstream::in); 

    myfile << "test"; 
    if (myfile.fail()) 
    { 
    cout << "Error writing to test.txt\n"; 
    myfile.clear(); 
    } 

    myfile.getline (buffer,80); 
    cout << buffer << " successfully read from file.\n"; 

    return 0; 
} 

在上面的例子MYFILE被打開以用於輸入操作,但是在其上僅執行的輸出操作,所以failbit被設置。然後該示例調用清除以便移除該標誌並允許進一步的操作,如getline在myfile上成功執行。

參考:ios::clear

0
while(!(std::cin >> array[i])) 
{ 
std::cin.clear();    //clears any error flags on cin so get() works 
while(std::cin.get()!= '\n') //in case white space is in the stream 
{        //loop until the end of line character 
    continue;    
} 
std::cout << "enter a new input: "; 
} 

信息中的註釋。