Избегание комментариев с C ++ getline ()

0

Я использую getline(), чтобы открыть файл.cpp.

getline(theFile, fileData);

Мне интересно, есть ли способ getline() избежать захвата c++ комментариев (/*, */ и //)?

Пока что попытка такого рода не работает.

if (fileData[i] == '/*')
Теги:

3 ответа

4
Лучший ответ

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

Для этого вы можете загрузить файл в строку и создать конечный автомат со следующими состояниями:

  1. Это фактический код
  2. Предыдущий символ был /
  3. Предыдущий символ был *
  4. Я однострочный комментарий
  5. Я многострочный комментарий

Конечный автомат начинается в состоянии 1

Если машина находится в состоянии 1 и имеет знак a /, переход в состояние 2.

Если машина находится в состоянии 2 и имеет знак a /, переход в состояние 4. В противном случае переход к государству 1.

Если машина находится в состоянии 2 и имеет знак *, переход в состояние 5. В противном случае переход к государству 1.

Если машина находится в состоянии 4 и отображает символ новой строки, перейдите в состояние 1.

Если машина находится в состоянии 5 и попадает в символ *, переход в состояние 3.

Если машина находится в состоянии 3 и имеет знак a /, переход в состояние 1 (конец многострочного комментария заканчивается). В противном случае переход к государству 5.

Если вы помечаете позиции символов, в которых машина входит и выходит из состояний комментариев, вы можете удалить эти символы из строки.

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

  • 1
    В состоянии 1 вам нужно как минимум добавить проверку на наличие строк - и затем обработать возможный экранированный символ \" внутри этой строки и двойные экранированные символы. С другой стороны, альтернативные комментарии C ++ // могут быть добавлены сразу (и тогда только проверяйте конец строки).
  • 1
    Конечный автомат также должен иметь состояния для нахождения внутри строки (или многобайтового символа). Можно найти простой фильтр, написанный на C, который преобразует комментарии в стиле // в /* */ comments здесь: stackoverflow.com/a/12000755/12711, его можно использовать в качестве отправной точки для фильтра, который полностью удаляет комментарии из потока.
Показать ещё 1 комментарий
3

Итак, одна проблема заключается в том, что if(fileData[i] == '/*') тестирует, если char fileData[i] равен '/*' который... Не char.

Чтобы найти, содержит ли строка комментарий, вы, вероятно, захотите изучить одно из следующих:

  • <regex> в C++ 11 (У Boost есть библиотека регулярных выражений, если это больше ваша вещь.)
  • strstr в ванили C/C++.

Для многострочных комментариев вы, вероятно, захотите сохранить что-то вроде хранения флага, указывающего, было ли состояние предыдущей строки "в комментарии" или нет, а затем искать /* или */ соответствии с этим флагом, обновляя его как вы идете.

0

Одиночные кавычки обозначают char, а тип данных char - char. SINGLE char. '/*' не имеет смысла, потому что это два char тогда как fileData[i] относится к одному char.

Ваш оператор if должен быть гораздо более надежным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню