在 C++ 中读取具有混合值的行

Reading line with mixed values in C++

我正在尝试编写一个 C++ 代码来读取文本文件,文件的每一行都包含双精度值和字符串值,并且对于双精度值和字符串值出现在线。我的线条的示例:

Inf 1.8 1.4 Inf Inf 3.48. 

我目前正在使用这段代码:

vector<double>temp;
string line;
ifstream travelFile(filepath);
while (getline(travelFile, line)) {
    string delimiter = " ";
    size_t pos = 0;
    string token; 
    while ((pos = line.find(delimiter)) != string::npos) {
        token = line.substr(0, pos);
        if ((token[0] == 'I') || (token[0] == 'i')) { temp.push_back(DBL_MAX); }
        else{ temp.push_back(stod(token)); };
        line.erase(0, pos + delimiter.length());
    }
    if (line.size() != 0){
        if ((line[0] == 'I') || (line[0] == 'i')) { temp.push_back(DBL_MAX); }
        else { temp.push_back(stod(line)); }
        travelTime.push_back(temp);
    }
    temp.clear();
}

但是,它有一些我不喜欢的限制:首先它不接受除 space 以外的任何其他分隔符,有时我不得不处理带有制表符分隔符的文件。此外,它不接受除 "Inf" 以外的任何字符串值,有时文件可以包含 "inf"。

有一种更简单的白色分割线的方法space:与您通常从输入流中读取格式化输入的方式相同。

像现在一样阅读台词。但不是使用 find 等来解析字符串,而是对行使用 std::istringstream,并使用普通输入运算符 >> 提取白色-space 分隔 "tokens" 从行.

类似

while (std::getline(travelFile, line))
{
    std::istringstream iss(line);
    std::string token;
    while (iss >> token)
    {
        // Do something with the extracted token
    }
}

要将字符串转换为 double,您可以执行与上述相同的操作,但尝试读入 double 值并检查成功或失败。或者使用例如std::stod 将字符串转换为 double 并进行验证。