避免使用C++ getline() 的评论

Avoiding Comments w/ C++ getline()

本文关键字:评论 getline C++      更新时间:2023-10-16

我正在使用getline((打开一个.cpp文件。

getline(theFile, fileData);

我想知道是否有任何方法可以让 getline(( 避免抓取 c++ 注释(/*, *///(?

到目前为止,尝试这样的事情并不完全有效。

if (fileData[i] == '/*')
我认为

阅读评论是不可避免的,但是您可以通过一次阅读一个字符来处理它们。

为此,您可以将文件加载到字符串中,并构建具有以下状态的状态机:

  1. 这是实际代码
  2. 前一个角色是/
  3. 前一个角色是*
  4. 我是单行评论
  5. 我是多行评论
状态

机从状态 1 启动

如果计算机处于状态 1 并命中/字符,请转换为状态 2

如果计算机处于状态 2 并命中/字符,请转换为状态 4。否则,请过渡到状态 1

如果计算机处于状态 2 并命中*字符,请转换为状态 5。否则,请过渡到状态 1

如果计算机处于状态 4 并命中换行符,则转换为状态 1

如果计算机处于状态 5 并命中*字符,则转换为状态 3

如果计算机处于状态 3 并命中/字符,则转换为状态 1(多行注释结束(。否则,过渡到状态 5

如果标记机器进入和退出注释状态的字符的位置,则可以从字符串中删除这些字符。

或者,您可以探索正则表达式,这些正则表达式提供了非常简洁地描述这种状态机的方法。

所以,一个问题是if(fileData[i] == '/*')正在测试char fileData[i]是否等于'/*'这是......不是char.

要查找行是否包含注释,您可能需要查看以下内容之一:

  • <regex> 在 C++11 中(Boost 也有一个正则表达式库,如果这更符合您的要求。
  • strstr香草 C/C++。
对于多行注释,

您可能希望存储类似存储一个标志的东西,指示前一行的状态是否为"在注释中",然后根据该标志搜索/**/,并随时更新它。

引号表示charchar数据类型表示单char."/*"没有意义,因为它是两个charfileData[i]指的是单个char

您的if声明需要更加强大。