0

到目前为止我有以下代码

#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;
}

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

(ASCII 垃圾) 1:66 OS 波兰华沙(ASCII 垃圾)

示例图片:


另一个例子:


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

我认为可能会有所帮助的是首先以 (Number)(Number)(Colon)(Number)(Space) 或 (Number)(Colon)(Number)(Space) 的形式搜索某些内容,然后将所有内容收集起来,直到不是字母/逗号/句号/等的东西,并添加换行符。这可以做到吗?

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

编辑:第一次尝试

#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++ 禁止指针和整数之间的比较”

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

4

2 回答 2

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();
}

上面的代码删除了所有非字母字符。这里有一些参考资料更详细地解释了每个功能:

希望能帮助到你。祝你好运!

于 2013-02-28T15:08:48.950 回答
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;
 }
于 2013-02-28T15:10:33.553 回答