我正在使用getline()打开.cpp文件。
getline(theFile, fileData);
我想知道是否有任何办法让getline()避免抓取c ++评论(/*, */
和//
)?
到目前为止,尝试这样的事情并不是很有效。
if (fileData[i] == '/*')
答案 0 :(得分:4)
我认为您阅读评论是不可避免的,但您可以通过一次读取一个字符来处理它们。
为此,您可以将文件加载到字符串中并构建具有以下状态的状态机:
/
*
状态机以状态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)
单引号指定char
,char
数据类型表示单char.
'/ *'没有意义,因为它是两个char
而fileData[i]
指的是单个char
。
您的if
声明需要更强大。