如何检查文件中的每一行是否格式正确?
例如,假设我有这个文本文件“
WordOne 0.2
WordTwo 0.1
WordThree 0.38
WordFour WordFour <--- This would be incorrectly formatted.
第一个单词应该是一个字符串,第二个单词应该是double。我怎样才能正确检查这个?
答案 0 :(得分:2)
如果s
是文件关联的文本流,则为std::string wd; double d;
像s >> wd >> d
这样的表达式将尝试读取单词和double,并且如果以某种方式失败,则计算为“false”(实际上为nullptr)。
此时您应该重置错误标志(s.clear()
),将任何内容丢弃为“\ n”并继续。 (s.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
)
您可以计算读取行,因为保存读取失败的行号。
答案 1 :(得分:1)
我的问题regular expressions是您问题的最佳解决方案。
C ++ 11支持它们:
#include <regex>
#include <string>
#include <vector>
#include <iostream>
auto lines = std::vector<std::string> {
"WordOne 2",
"WordTwo 10.1",
"WordThree 0.38",
"WordThree 0.",
"WordFive WordFive"
};
int main() {
std::regex re("\\w+\\s+\\d+\\.?\\d*");
for(auto line : lines) {
if(!std::regex_match(line, re)) {
std::cout << "Line: \"" << line
<< "\" is incorrectly formatted" << std::endl;
}
}
}
此代码允许使用各种形式的分数浮点语法。您可能希望使其更严格或允许指数形式 - 只需修改正则表达式:)