文件 io - 读取 C++ 中已知格式的数据

file io - Read data of known format in c++

本文关键字:格式 数据 io 读取 C++ 文件      更新时间:2023-10-16

我有一个 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 之前(值,我该怎么做?请注意,没有空格。众所周知,tabpar出现在所有数据行中。

您的"奇怪的文本文件"是RTF格式。您可以尝试自己编写解析器,但使用像 http://sourceforge.net/projects/librtf/这样的库可能会更好。

更好的是,请问谁给你数据,以正确的格式发送。以我的拙见,在 RTF 文件中处理的数据有些荒谬。

您始终可以使用正则表达式,例如:

    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)");