Проблема с регулярным выражением: почему мой код не работает должным образом? - PullRequest
1 голос
/ 19 мая 2019

У меня действительно странная проблема.Я пытаюсь прочитать входные данные из файла, а затем с помощью регулярного выражения найти и распечатать результат на экране.Мой файл содержит тележки и название продукта.Файл содержит тысячи строк, поэтому вот небольшой пример файла:

Cart561
219328518230,0B6060D038C0,819303200230,81E068407C08,A44323118230,A44488643848,8484C2D09A40,A1460324CA40,
Cart210
834248C52248,8490CB1068C0,
Cart2460B41A124C218,06C1A12528C0,864249906620,2344B20C4230,291329103218,8490CB1068C0,2370231180B0,294621306230
... (More below)

Когда я пытаюсь прочитать и распечатать только первые 5 или 10 телег, мой код работает правильно.Однако, когда я пытаюсь прочитать и распечатать все карты и имена, по какой-то причине это не начинается с самого начала.Вместо этого он переходит к середине файла и начинает там обработку.

Вот мой код:

#include <iostream>
#include <regex>
#include <fstream>

using namespace std;

int main()
{
    ifstream cart("Carts.csv");
    regex h("[0-9A-Z]{12}");
    smatch n;
    int count = 0;

    while (getline(cart, line))
    {
        // If count is an even number, the compiler will print out the cart's name
        if (count % 2 == 0)
            cout << line << endl;
        while (regex_search(line, n, h))
        {
            for (auto x : n)
                cout << x << endl;
            line = n.suffix().str();
        }
        count++;
        cout << count << endl;  // This one just for my test
    }

Если я добавлю это в цикл while, чтобы он сначала выводил только 5Результаты:

if(count==5) {break;}

Код работает нормально.Но если я удаляю этот код и позволяю компилятору читать и распечатывать весь файл, он не печатает первую половину файла, он начинается в середине нигде, как это:

A444B0246A40
2305A3109818
24E060D06260
819302D48860
29460A4528C0
09C24A503260
0B3058819260
8484E910C890
234260C19260
60C629016890
8910C98C18C0
0B60492000B0
234270246848
864482718C80
06C260C43260
2344B0306620
A44322548890
42 -> This is number of line in file
Cart277
43 -> This is number of line in file
A44482C16848
294482D090B0
2652230C4A40
0CC629112830
896408C168C0
06C1A12528C0
86424864C248
864248D0C620
E0424B058218
2910F0342230
2C10E2446230
2490F0318620
A441A244C230
8490CB1068C0
0B6060D038C0
A44242616848
0B44898438C0
81C4A1843830
234270246848
8484C2D09A40
44 -> This is number of line in file
Cart287
45 -> This is number of line in file
... (More below)

Послетестируя, я понимаю, что это как-то игнорирует мои 41 первые строки.Счетчик отсчитывает с начала, но компилятор выводит результат только из середины 42-й строки.(Если вы хотите знать, в файле всего 1994 строк)

Короче говоря, я до сих пор не знаю, в чем именно заключается моя проблема и что мне теперь делать, чтобы это исправить.Есть ли у вас какие-либо предложения?Я очень признателен, если кто-нибудь из вас сможет объяснить мне, почему это произошло.

P / s: Поскольку это часть моего домашнего задания, я должен использовать регулярное выражение.

Редактировать:Я печатаю результат в текстовом файле, и он показывает все строки.Но мне все еще нужно, чтобы он работал так же на компиляторе, поскольку это то, на что будет смотреть мой инструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...