getline() を使用して .cpp ファイルを開きます。
getline(theFile, fileData);
getline() が C++ コメント (/*, */
および//
)を取得しないようにする方法があるかどうか疑問に思っています。
これまでのところ、このようなことを試してもうまくいきません。
if (fileData[i] == '/*')
getline() を使用して .cpp ファイルを開きます。
getline(theFile, fileData);
getline() が C++ コメント (/*, */
および//
)を取得しないようにする方法があるかどうか疑問に思っています。
これまでのところ、このようなことを試してもうまくいきません。
if (fileData[i] == '/*')
コメントを読むのはやむを得ないと思いますが、ファイルを一文字ずつ読むことで処分できます。
これを行うには、ファイルを文字列にロードし、次の状態でステート マシンを構築します。
/
*
ステート マシンはステート 1で開始します。
マシンが状態 1にあり、文字をヒットすると、状態 2/
に遷移します。
マシンが状態 2にあり、文字をヒットすると、状態 4/
に遷移します。それ以外の場合は、状態 1に遷移します。
マシンが状態 2にあり、文字をヒットすると、状態 5*
に遷移します。それ以外の場合は、状態 1に遷移します。
マシンが状態 4にあり、改行文字にヒットした場合、状態 1に遷移します。
マシンが状態 5にあり、文字をヒットすると、状態 3*
に遷移します。
マシンが状態 3にあり、文字をヒットすると、状態 1/
に遷移します(複数行のコメントが終了します)。それ以外の場合は、状態 5に遷移します。
マシンがコメント状態に出入りする文字の位置をマークすると、文字列からこれらの文字を取り除くことができます。
または、この種のステート マシンを非常に簡潔に記述する方法を提供する正規表現を調べることもできます。
したがって、1 つの問題は、が と等しいif(fileData[i] == '/*')
かどうかをテストすることです... ではありません。char
fileData[i]
'/*'
char
行にコメントが含まれているかどうかを確認するには、おそらく次のいずれかを調べる必要があります。
<regex>
C++11 で(Boost には正規表現ライブラリもあります。それが必要な場合)。strstr
バニラ C/C++ で。複数行のコメントの場合、おそらく、前の行の状態が「コメント中」かどうかを示すフラグを保存し、そのフラグに従って検索/*
または更新して、更新するようなものを保存する必要があります。*/
単一引用符はを示しchar
、char
データ型は単一の '/*' を表しますが、char.
意味がありません。char
fileData[i]
char
あなたのif
声明ははるかに堅牢である必要があります。