2013-10-07 60 views
0

我使用getline()打開一個.cpp文件。避免評論w/C++ getline()

getline(theFile, fileData); 

我不知道是否有任何方式有函數getline()避免搶奪C++註釋(/*, *///)?

到目前爲止,嘗試這樣的事情並不奏效。

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

我猜''/ *''不是一個字符 –

+0

請注意'/ * * /'註釋可以跨越多行,所以單行解決方案在這裏是不夠的。 – BartoszKP

+1

使用該字符串,你的程序會在自己的源代碼上窒息。 – usr2564301

回答

4

我認爲閱讀這些評論是不可避免的,但是您可以通過一次讀取一個字符來處理它們。

要做到這一點,你可以將文件加載到一個字符串,並建立一個狀態機具有以下狀態:

  1. 這是實際的代碼
  2. 以前的角色是/
  3. 前一個字符爲*
  4. 我是一個單行註釋
  5. 我是一個多行註釋

狀態機國家開始1

如果機器在狀態1和擊中/角色,轉型爲狀態2

如果機器在狀態2並擊中/角色,轉型爲國家4。否則,轉換到狀態1

如果機器在狀態2並擊中*角色,轉型爲國家5。否則,轉換到狀態1

如果機器在國家4並擊中換行字符,過渡到狀態1

如果機器在國家5並擊中*角色,轉型爲狀態3

如果機器處於狀態3和擊中/字符,過渡到狀態1(多行註釋結束時)。否則,轉換到狀態5

如果您標記機器進入和退出註釋狀態的字符位置,則可以從字符串中去除這些字符。

或者,您可以探索正則表達式,它提供了非常簡潔地描述這種狀態機的方法。

+1

在狀態1中,您至少需要添加一個字符串檢查 - 然後在該字符串內部處理一個可能的轉義'\「',並且* double *轉義。另一方面,替代的C++'''註釋可以直接添加(然後只檢查行結束) – usr2564301

+1

狀態機還需要具有處於字符串(或多字節字符)內部的狀態,可以找到用C編寫的簡單過濾器, '// *'風格評論到'/ * * /'這裏的評論:http://stackoverflow.com/a/12000755/12711它可以作爲過濾器的起點,完全從流中取消評論。 –

+1

而這女士們,先生們強調,即使是一個「簡單的」詞法分析器,只處理C/C++的子集也不是一件小事...... –

0

單引號指定charchar數據類型代表單個char.「/ *」沒有任何意義,因爲它是由兩個charfileData[i]指單個char

您的if聲明需要更加健壯。

3

於是,一個問題是,if(fileData[i] == '/*')是測試如果charfileData[i]等於'/*'這...這不是個char

找到,如果一個線包含註釋,你可能會想看看下列之一:(升壓有一個正則表達式庫爲好,如果這是更多你的事情)

對於多行註釋,你可能會想存儲的東西像商店標誌,指示前行的狀態是否「意見」與否,然後根據該搜索/**/標誌,隨時更新。