Игнорирование определенных строк в текстовом файле при разборе - PullRequest
0 голосов
/ 27 марта 2019

Я хочу прочитать файлы из текстового файла и сравнить некоторые строки с регулярным выражением.Первая строка txt-файла должна начинаться со строки #FIRST.И если строка должна начинаться с символа «#», строка должна игнорироваться, и она должна продолжаться.Таким образом, счетчик должен иметь значение 1, которое он делает, и он должен переходить ко второму оператору if if (counter == 1).Однако он не переходит ко второму оператору if.

txt файл:

#FIRST
#
#haha

Я ожидаю, что вывод будет хорошим \ nхорошо после однократного запуска кода.

Вывод:

   good.

И это должно быть

          good.
          good.

.........

#include <iostream> 
#include <string> 
#include <vector> 
#include <regex> 
#include <fstream> 
#include <sstream>

  int main() {

    std::ifstream input("test.txt");
    std::regex e("#FIRST");
    std::regex b("haha");
    int counter;
    for (counter = 0; !input.eof(); counter++) {
      std::cout << counter << "\n";

      std::string line;
      if (counter == 0) {
        getline(input, line);
        if (std::regex_match(line, e)) {
          std::cout << "good." << std::endl;
          counter++;

        } else
          std::cout << "bad." << std::endl;
        break;
      }

      getline(input, line);
      if (line[0] == '#')
        continue;

      if (counter == 1) {
        getline(input, line);
        if (std::regex_match(line, b)) {
          std::cout << "good." << std::endl;
        } else
          std::cout << "bad." << std::endl;
        break;

      }
    }

    return 0;
  }

1 Ответ

0 голосов
/ 27 марта 2019

Проблема связана с оператором break в первом предложении if. После получения первой строки ввода программа встречает оператор break и немедленно выходит из цикла. Никакие дальнейшие операторы не выполняются в цикле for, который, я считаю, является поведением, которое вы видите. Вам придется реструктурировать программу, чтобы она выглядела примерно так:

for loop {
  getline()
  if (counter == <>) {
    // no break
  } else if (line[0] == '#') {
    continue;
  } else {
    // whatever else you want to get done
  }
}
...