在 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
并进行验证。
我正在尝试编写一个 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
并进行验证。