3

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

我以 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);

似乎有点多余,我怎么能简单呢?

4

2 回答 2

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函数族。

于 2013-07-15T22:23:08.147 回答
1

您可以使用字符串标记器 如何在 C++ 中标记字符串?
特别是:https ://stackoverflow.com/a/55680/2436175

旁注:您不需要使用 atoi,您可以简单地执行以下操作:

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

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

于 2013-07-15T22:22:00.253 回答