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\tab 2.056771249\par

0.191986218\tab 2.045176705\par

0.27925268\tab 1.971733548\par

0.366519143\tab 1.844657601\par

0.453785606\tab 1.669694097\par

0.541052068\tab 1.4539812\par

0.628318531\tab 1.205819241\par

0.715584993\tab 0.934405231\par

0.802851456\tab 0.649540807\par

...... 等等...

我想读取这个文件并获取 x(出现在之前\tab)和 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 回答