如何以数字间隔读取文本文件? C ++

时间:2018-09-11 04:59:18

标签: c++ numbers intervals

我真的需要您的帮助进行编码:

我有一个file2文本文件,其中包含如下所示的数字范围:

12345678[5-8][0-9]
3684567150
329465207[023456789]
132478026[13]
778941351[02-689]
84364575[89][0-9]
88229401XX
981024833X
8912380XXX

所以这个数字范围像这样分解:

12345678[5-8][0-9]:   1234567850-1234567889
3684567150:           3684567150
329465207[023456789]: 3294652070 and 3294652072-3294652079
132478026[13]:        1324780261 and 1324780263
778941351[02-689]:    7789413510, 7789413512-7789413516, 7789413518 and 7789413519
84364575[89][0-9]:    8436457580-8436457599
88229401XX:           8822940100-8822940199
981024833X:           9810248330-9810248339
8912380XXX:           8912380000-8912380999

X可以从0 to 9取值。所有这些数字都是10位数字。但是范围有时可能会有很大差异,可以写为:[02-9]的范围写为:[023456789],反之亦然。

我只需要这部分内容来了解​​如何将其读为数字范围或定义类似的情况:

 XXXXXXXXX[X-X]
 XXXXXXXX[X-X][X-X]
 XXXXXXXXX[XX-X]
 XXXXXXXXX[XXXXXXXX]

等 但是对如何执行此操作没有任何想法,希望您能为我提供帮助。现在,我只是将文件中的数据保存到字符串向量中:

ifstream file2("file2.txt");

    while (getline(file2,line) && line.size()>=0)
        vfile2.push_back(line);

请不要孤单,我什至不知道该如何开始,我为此做了更多的代码,但这与这部分无关,因为这不仅是整个程序应该执行的任务,您需要证据让我知道。

谢谢!

已更新:

我有一个file2文本文件,其中包含如下所示的数字范围:

88229401XX
981024833X
8912380XXX

所以这个数字范围像这样分解:

88229401XX:           8822940100-8822940199
981024833X:           9810248330-9810248339
8912380XXX:           8912380000-8912380999

再次感谢您的帮助和时间,如果能解决此问题(我可能对此有一些想法),我会并行处理。

1 个答案:

答案 0 :(得分:0)

这是一个解析问题。有一些工具可以帮助您进行解析,但是必须学习它们。有时候,最好只是潜入并编写代码。如果您有条不紊,这并不难。诀窍是使代码的结构与您要解析的语法的结构相匹配。

以下代码假定您要将整数存储在向量中。它只是在最后打印出该向量的内容。

以下代码完全不对输入进行错误检查。在实际程序中,这将是一个严重的问题。我让您添加错误检查。

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdint>

typedef uint64_t int_type;

void parse(const std::string& line, std::vector<int_type>& numbers)
{
    numbers = { 0 };
    size_t i = 0;
    while (i < line.size())
    {
        char ch = line[i++];
        if (ch == '[')
        {
            // start a group
            std::string group;
            while (line[i] != ']')
            {
                char lo = line[i++];
                if (line[i] == '-')
                {
                    ++i;
                    char hi = line[i++];
                    while (lo <= hi)
                    {
                        group += lo;
                        ++lo;
                    }
                }
                else
                {
                    group += lo;
                }
            }
            ++i;
            // add the new numbers implied by the group
            std::vector<int_type> new_numbers;
            for (auto num : numbers)
            {
                for (auto digit : group)
                    new_numbers.push_back(10 * num + (digit - '0'));
            }
            numbers.swap(new_numbers);
        }
        else
        {
            std::transform(numbers.begin(), numbers.end(), numbers.begin(),
                [=](auto n) { return 10 * n + (ch - '0');  });
        }
    }
}

int main()
{
    std::string data = "12345678[5-8][0-9]\n"
        "3684567150\n"
        "329465207[023456789]\n"
        "132478026[13]\n"
        "778941351[02-689]\n"
        "84364575[89][0-9]\n";
    std::istringstream input(data);
    std::string line;
    while (getline(input, line) && line.size() >= 0)
    {
        std::vector<int_type> numbers;
        parse(line, numbers);
        for (auto num : numbers)
        {
            std::cout << num << '\n';
        }
        std::cout << '\n';
    }
}

仅经过简短测试,但似乎可以正常工作。