2013-07-15 104 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系列函数。