2013-07-15 85 views
3

我想解析一個文件,它逐行描述一組數據。每個數據由3或4個參數組成:int int float(可選)string。C++解析文件中的行爲流

我打開文件作爲ifstream的INFILE和while循環

while (inFile) { 

    string line; 
    getline(inFile,line); 
    istringstream iss(line); 


    char strInput[256]; 

    iss >> strInput; 
    int i = atoi(strInput); 

    iss >> strInput; 
    int j = atoi(strInput); 

    iss >> strInput; 
    float k = atoi(strInput); 

    iss >> strInput; 

    cout << i << j << k << strInput << endl;*/ 


} 

的問題是,最後一個參數是可選的使用它,所以我可能會遇到錯誤時,它不存在。我如何預先檢查每個數據有多少個參數?

此外,

string line; 
    getline(inFile,line); 
    istringstream iss(line); 

似乎有點reduldant,我怎麼可能simplyfiy呢?

+0

你是什麼意思「可能」遇到錯誤? – Borgleader

+0

例如,如果我得到像 223 243 66.579第一條街道,我的版本不會解析街道 –

+0

我想知道可能,它似乎意味着你沒有運行的代碼,只是認爲它不會正常工作。 – Borgleader

回答

6

在這種情況下使用慣用方法,它變得更簡單:

for (std::string line; getline(inFile, line);) { 
    std::istringstream iss(line); 
    int i; 
    int j; 
    float k; 

    if (!(iss >> i >> j)) { 
     //Failed to extract the required elements 
     //This is an error 
    } 

    if (!(iss >> k)) { 
     //Failed to extract the optional element 
     //This is not an error -- you just don't have a third parameter 
    } 
} 

順便說一句,atoi有一些非常不期望的不確定性,除非0不是爲你解析字符串的可能值。由於atoi在出現錯誤時返回0,因此無法知道0的返回值是否成功解析值爲0的字符串,或者如果它是錯誤,除非您對原始字符串進行了一些非常費力的檢查。

儘量採用流,但在你需要回落到atoi類型的功能的情況下,去與strtoX家庭的功能(strtoistrtolstrtof等)。或者,更好的是,如果您使用的是C++ 11,請使用stoX系列函數。