在C ++中使用混合值读取行

时间:2018-04-17 18:06:28

标签: c++ string double readfile

我正在尝试编写一个C ++代码来读取文本文件,文件的每一行都包含双精度值和字符串值,并且没有特定的顺序来指示行中出现的double值和字符串值。我的行看起来如何的一个例子:

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();
}

但是,它没有什么限制,我不喜欢:首先它不接受除空格之外的任何其他分隔符,有时我必须处理带有制表符分隔符的文件。此外,除了&#34; Inf&#34;之外,它不接受任何字符串值,有时文件可以包含&#34; inf&#34;代替。

1 个答案:

答案 0 :(得分:3)

有一种更简单的方法可以在空格上分割线条:与通常从输入流中读取格式化输入的方式相同。

像现在一样阅读这些行。但是,不是使用find等来解析字符串,而是使用std::istringstream作为行,并使用普通输入运算符>>来提取空格分隔的&#34;令牌&# 34;从线上。

这样的东西
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