我正在尝试编写一个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;代替。
答案 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
。