Я использую getline(), чтобы открыть файл.cpp.
getline(theFile, fileData);
Мне интересно, есть ли способ getline() избежать захвата c++ комментариев (/*, */
и //
)?
Пока что попытка такого рода не работает.
if (fileData[i] == '/*')
Я думаю, что вам не следует читать комментарии, но вы можете избавиться от них, прочитав файл по одному символу за раз.
Для этого вы можете загрузить файл в строку и создать конечный автомат со следующими состояниями:
/
*
Конечный автомат начинается в состоянии 1
Если машина находится в состоянии 1 и имеет знак a /
, переход в состояние 2.
Если машина находится в состоянии 2 и имеет знак a /
, переход в состояние 4. В противном случае переход к государству 1.
Если машина находится в состоянии 2 и имеет знак *
, переход в состояние 5. В противном случае переход к государству 1.
Если машина находится в состоянии 4 и отображает символ новой строки, перейдите в состояние 1.
Если машина находится в состоянии 5 и попадает в символ *
, переход в состояние 3.
Если машина находится в состоянии 3 и имеет знак a /
, переход в состояние 1 (конец многострочного комментария заканчивается). В противном случае переход к государству 5.
Если вы помечаете позиции символов, в которых машина входит и выходит из состояний комментариев, вы можете удалить эти символы из строки.
В качестве альтернативы вы можете исследовать регулярные выражения, которые обеспечивают краткое описание этого типа конечного автомата.
Итак, одна проблема заключается в том, что if(fileData[i] == '/*')
тестирует, если char
fileData[i]
равен '/*'
который... Не char
.
Чтобы найти, содержит ли строка комментарий, вы, вероятно, захотите изучить одно из следующих:
<regex>
в C++ 11 (У Boost есть библиотека регулярных выражений, если это больше ваша вещь.)strstr
в ванили C/C++. Для многострочных комментариев вы, вероятно, захотите сохранить что-то вроде хранения флага, указывающего, было ли состояние предыдущей строки "в комментарии" или нет, а затем искать /*
или */
соответствии с этим флагом, обновляя его как вы идете.
Одиночные кавычки обозначают char
, а тип данных char
- char.
SINGLE char.
'/*' не имеет смысла, потому что это два char
тогда как fileData[i]
относится к одному char
.
Ваш оператор if
должен быть гораздо более надежным.
\"
внутри этой строки и двойные экранированные символы. С другой стороны, альтернативные комментарии C ++//
могут быть добавлены сразу (и тогда только проверяйте конец строки).//
в/* */
comments здесь: stackoverflow.com/a/12000755/12711, его можно использовать в качестве отправной точки для фильтра, который полностью удаляет комментарии из потока.