避免使用C ++ getline()进行评论

时间:2013-10-07 22:08:03

标签: c++

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

getline(theFile, fileData);

我想知道是否有任何办法让getline()避免抓取c ++评论(/*, *///)?

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

if (fileData[i] == '/*')

3 个答案:

答案 0 :(得分:4)

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

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

  1. 这是实际代码
  2. 上一个字符为/
  3. 上一个字符为*
  4. 我是单行评论
  5. 我是一个多行评论
  6. 状态机以状态1

    开始

    如果机器处于状态1 并且遇到/个字符,请转换为状态2

    如果机器处于状态2 并且遇到/个字符,请转换为状态4 。否则,请转换为状态1

    如果机器处于状态2 并且遇到*个字符,请转换为状态5 。否则,请转换为状态1

    如果计算机处于状态4 并且点击换行符字符,请转换为状态1

    如果机器处于状态5 并且遇到*个字符,请转换为状态3

    如果计算机处于状态3 并且遇到/个字符,请转换为状态1 (多行注释结束)。否则,请转换为状态5

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

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

答案 1 :(得分:3)

因此,一个问题是if(fileData[i] == '/*')正在测试char fileData[i]是否等于'/*',而不是char。< / p>

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

  • <regex> in C++11(Boost还有一个正则表达式库,如果你的话更多的话。)
  • strstr in vanilla C / C ++。

对于多行注释,您可能希望存储类似存储标志的内容,指示前一行的状态是否为“在评论中”,然后搜索/*或{{1根据那个标志,你可以随时更新它。

答案 2 :(得分:0)

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

您的if声明需要更强大。