3

次のように、スペースで区切られた浮動小数点数を含む txt ファイルがありました。

3.141600 7.54654

4.021560 7.54654

7.54654 4.021560

9.549844 3.141600

そして、次のコードを使用してデータを読み取りました..

int main ()
{

    ifstream file("myFile.txt");

    float x;
    float y;

    while(file >> x >> y)
    std::cout << x << ' ' << y << std::endl;

    system ("pause");
}

それはうまくいきます.....

今、私は次のようなものを含む非常に奇妙なテキストファイルを与えられています:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}

{*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\f0\fs20 0.017453293\tab

2.01623406\par

0.087266463\タブ 2.056771249\パー

0.191986218\tab 2.045176705\par

0.27925268\タブ 1.971733548\パー

0.366519143\タブ 1.844657601\パー

0.453785606\タブ 1.669694097\パー

0.541052068\タブ 1.4539812\パー

0.628318531\タブ 1.205819241\パー

0.715584993\タブ 0.934405231\パー

0.802851456\タブ 0.649540807\パー

...... 等々...

\tabこのファイルを読み込んで x ( の前に表示される) と y ( の前に表示される) の値を取得したいのですが、\parどうすればよいですか? スペースがないことに注意してください。それはわかって\tabおり\par、データのすべての行に表示されます。

4

2 に答える 2

4

「奇妙なテキスト ファイル」は RTF 形式です。パーサーを自分で書いてみることもできますが、http://sourceforge.net/projects/librtf/のようなライブラリを使ったほうがよいかもしれません。

さらに良いことに、データを提供した人に、適切な形式で送信するよう依頼してください。私の謙虚な意見では、RTF ファイルで処理するためのデータはややばかげています。

于 2013-02-16T07:20:57.160 に答える
4

次のような正規表現をいつでも使用できます。

    std::string pattern("(\\d+.\\d+)\\\\tab[^\\d]+(\\d+.\\d+)\\\\par");
    std::regex r(pattern);

    std::ifstream ifs("input_data.txt");

    std::string data;
    while(getline(ifs, data))
    {
        for (std::sregex_iterator it(data.begin(), data.end(), r), end_it; it != end_it; ++it)
        {
            std::cout << it->str(1) << " " << it->str(2) << std::endl;
        }
    }

(!) X 値と Y 値の間に改行がある場合、ファイルの内容を文字列で読み取る必要がある場合があります。

編集:

生の文字列リテラルを使用したパターン:

std::string pattern(R"((\d+.\d+)\\tab[^\d]+(\d+.\d+)\\par)");

于 2013-02-16T07:50:48.620 に答える