如何编写字母数字文件解析器?

时间:2013-02-28 14:52:35

标签: c++ parsing

到目前为止我有以下代码

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(){
    ofstream outfile;
    ifstream infile;
    string line;

    infile.open ("input.DAT");
    outfile.open ("output.txt");

    while (infile.good()){
        getline (infile, line);
        outfile << line << endl;
    }

    outfile.close();
    infile.close();

    return 0;
}

所有这一切都取得了它的输入.DAT并将其输出到output.txt。但是输入文件不干净。它是这种格式:

  

(ASCII垃圾) 1:66 OS WARSAW,波兰(ASCII垃圾)

示例pic:


另一个例子:


所以我想做的是在垃圾,换行符分隔之间输出内容。但是我不知道如何按字符迭代/输出,以及指示什么是有效输出的好方法(我的意思是我可以检查字符是否在我想的特定范围内但我不知道这是怎么回事用C ++完成)。

我认为可能有所帮助的是首先搜索(数字)(数字)(冒号)(数字)(空格)或(数字)(冒号)(数字)(空格)然后采取的形式所有事情,直到不是字母/逗号/句号/等,并添加换行符。可以这样做吗?

我希望这是有道理的!如果我需要澄清更多,请告诉我。

编辑:第一次尝试

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;

int main(){
    ofstream outfile;
    ifstream infile;
    string line, res;

    infile.open ("input.DAT");
    outfile.open ("output.txt");

    while (infile.good()){
        std::getline(infile, line);

        res = "";
        for(std::string::size_type i = 0; i < line.length()-4; i++){
            if (isdigit(line[i+1]) && line[i+2]==":" && isdigit(line[i+3])){
                res+=line[i];
                i++;
                while (isalnum(line[i]) || line[i] == "/" || line[i] == "\\" || line[i] == "=" || line[i] == "#" || line[i] == ":" || line[i] == " " || line[i] == "." || line[i] == "," || line[i] == "-" || line[i] == "'" || line[i] == '"'){
                    res+=line[i];
                    i++;
                }
                outfile << res << endl;
                res = "";
            }  
        }


    }

    outfile.close();
    infile.close();

    return 0;
}

它不能编译,因为“ISO C ++禁止指针和整数之间的比较”

编辑:修正了我自己,将引号改为单引号。我想我在这里想出了自己的问题。它不会让我删除我的问题。

2 个答案:

答案 0 :(得分:3)

我会让你自己决定什么是垃圾,什么不是。下面是一个示例,说明在将其写入另一个文件之前,如何从每行中删除所有不喜欢的符号:

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>

static bool is_garbage(char c)
{
    return !isalnum(c); // This is my perception on garbage. Yours might be different.
}

int main()
{
    std::ofstream outfile;
    std::ifstream infile;
    std::string line;

    infile.open("input.DAT");
    outfile.open("output.txt");

    while (infile.good()) {
        std::getline(infile, line);
        line.erase(std::remove_if(line.begin(), line.end(), is_garbage),
                   line.end());
        outfile << line << std::endl;
    }

    outfile.close();
    infile.close();
}

上面的代码删除了不是字母字符的所有内容。以下是一些参考资料,可以更详细地解释每个函数:

希望它有所帮助。祝你好运!

答案 1 :(得分:1)

所以,这样的函数:

#include <cctype>

std::string clean_string(const std::string &str)
{
    std::string res;
    for(std::string::size_type i = 0; i < str.length(); i++)
    {
       if (std::isprint(str[i])
          res += str[i];
    }
    return res;
 }