c ++将文件中的行解析为流

时间:2013-07-15 22:15:01

标签: c++ string file-io

我想解析一个逐行描述一组数据的文件。每个数据由3或4个参数组成:int int float(optional)string。

我打开文件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);

看起来有点红,我怎么能简单地说呢?

2 个答案:

答案 0 :(得分: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系列函数(strtoi,{{1} },strtol等)。或者,更好的是,如果您使用的是C ++ 11,请使用stoX函数族。

答案 1 :(得分:1)

您可以使用字符串标记器How do I tokenize a string in C++?
特别是:https://stackoverflow.com/a/55680/2436175

旁注:你不需要使用atoi,你可以这样做:

int i,j;
iss >> i >> j;

(但这不会单独处理可选元素的问题)