Как прочитать текстовый файл с числовыми интервалами?C ++ - PullRequest
0 голосов
/ 11 сентября 2018

Мне очень нужна ваша помощь с тем, как закодировать это:

У меня есть 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 голосов
/ 11 сентября 2018

Это проблема разбора.Существуют инструменты, которые помогут вам с разбором, но они должны быть изучены.Иногда лучше просто погрузиться и написать код.Это не так сложно, если вы методичны в этом.Хитрость заключается в том, чтобы структура вашего кода соответствовала структуре разбираемой вами грамматики.

В следующем коде предполагается, что вы хотите хранить целые числа в векторе.Он просто распечатывает содержимое этого вектора в конце.

Следующий код не проверяет ошибки ввода вообще.В реальной программе это было бы серьезной проблемой.Я оставлю вас, чтобы добавить проверку ошибок.

#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';
    }
}

Только кратко проверено, но, похоже, работает.

...