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 GARBAGE) 1:66 OS ワルシャワ、ポーランド(ASCII GARBAGE)

例の写真:


もう一つの例:


だから私がやりたいのは、改行で区切られたゴミの間のものを出力することです。しかし、文字ごとに反復/出力する方法と、有効な出力を指示する良い方法はわかりません(文字が特定の範囲内にあるかどうかを確認できることを意味しますが、これがどのようになっているのかわかりません) 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 ++はポインターと整数の比較を禁止している」ため、コンパイルされません

編集:これを自分で修正し、引用符を一重引用符に変更しました。ここで自分の問題を理解したと思います。ただし、質問を削除することはできません。

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 に答える