检查文本文件是否在C ++中正确格式化

时间:2015-01-28 22:24:29

标签: c++

如何检查文件中的每一行是否格式正确?

例如,假设我有这个文本文件“

WordOne        0.2
WordTwo        0.1
WordThree      0.38
WordFour      WordFour   <--- This would be incorrectly formatted.

第一个单词应该是一个字符串,第二个单词应该是double。我怎样才能正确检查这个?

2 个答案:

答案 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;
        }
    }
}

此代码允许使用各种形式的分数浮点语法。您可能希望使其更严格或允许指数形式 - 只需修改正则表达式:)