2017-02-19 61 views
1

我在這裏編寫了一個代碼,它逐行讀取一個輸入文件,並創建一個矢量矢量,然後在作業中將其用作矩陣。這是代碼:在C++中使用getline輸入文件檢查>>運算符

vector<vector<int>> inputMatrix; 
string line; 
while(!file.eof()) 
{ 
    getline(file, line); 
    stringstream ss(line); 

    int num; 
    vector<int> temp; 

    while(ss >> num) 
    { 
     temp.push_back(num);   
    } 
    inputMatrix.push_back(temp); 
} 

但是,某些輸入文件可能包含非整數值。我想集成矩陣創建的輸入檢查功能,以便在輸入文件中存在非整數值時,我的程序將退出。

我該如何做到這一點?在這個while循環或代碼中的其他地方寫一些東西會不會是正確的?

非常感謝你提前。

+4

[爲什麼的iostream :: EOF算錯了一個循環條件裏面? ](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Biffen

回答

0

我想整合輸入檢查功能的矩陣構建,這樣當有一個非整數在輸入文件中的值,我的程序將退出。

stringstream已經爲您檢查。你可以簡單地在while循環之後測試它的狀態。如果它未能解析非整數值,則失敗位將被設置爲true。

這裏有一個working demo(有一些小的改進):

#include <iostream> 
#include <vector> 
#include <sstream> 
using namespace std; 

int main() { 
    vector<vector<int>> inputMatrix; 
    string line; 
    while(getline(cin, line)) 
    { 
     istringstream iss(line); 

     int num; 
     vector<int> temp; 

     while(iss >> num) 
     { 
      temp.push_back(num);   
     } 
     if(!iss) { 
      cout << "Bad input detected!" << endl; 
      return 1; 
     } 
     inputMatrix.push_back(temp); 
    } 
    return 0; 
} 

輸入

12 13 46 3 
42 2.6 5 

輸出

Bad input detected! 
1

cppreference.com

如果提取失敗,零寫入值和failbit設置。如果 提取的結果值太大或太小而不適合 值,則寫入std :: numeric_limits :: max()或std :: numeric_limits :: min() ,並設置failbit標誌。

所以,你可以簡單地添加一個if從句後while循環:

while (ss >> num) 
{ 
    temp.push_back(num); 
} 
if (ss.fail()) // explicitly check for failbit 
{ 
    expected_integer_error(); 
} 
+0

'if(!ss){...'應該足夠了。 –