見学に行くとしたら【天国】と【地獄】どっち?

読み込みたい数値データ以外にも、コメントの文字列が含まれている以下のようなテキストファイルがあります。
ここから、数値データだけを読み込む入力部のプログラムが作りたいです。

例:
/* テストデータ 計測日時 2022.10.1 - 10.5
*/
100,65 // 最大値と平均値
2000 // サンプル数
:

これらのコメントの文字列を無視して、数値データを読み込むプログラム部分について教えてください。
コメントは、C言語と同様、// 以降の行末までと /*  と */ で囲まれた部分です。

この種の入力プログラムのコーディングは難しいものでは無いとは思いましたが、車輪の再発見になりそうなので、質問しました。
定番のソースリストなどあれば、参考にしたいと思いますのでご教示、お願いします。

質問者からの補足コメント

  • 備忘録を兼ねて。コメント文字列を無視するコードです。

    c=fgetc(fd);
    if(c == '/') {
      c=fgetc(fd);
      if(c=='/') {    // 行末まで読み飛ばす
        do c=fgetc(fd); while(c>=0 && c !='\n');
        c = '\n';
      } else if(c=='*') { // "*/" まで読み飛ばす
        do {
          do c=fgetc(fd); while(c>=0 && c !='*');
          do c=fgetc(fd); while(c == '*');
        } while(c>=0 && c != '/');
        c=' ';
      } else {
        ungetc(c, fd); // 2文字目を戻す
        c = '/';
      }
    }

      補足日時:2022/10/06 07:18

A 回答 (5件)

「検索する」ってのはもちろんうまい「検索ワード」を選ばないといけないわけだけど, 例えばわたしのところでは


「C コメント 削除 プログラム」
で検索するといくつかコードがいくつか出てくるんだ.

「どこまでがんばるのか」ってのは, 例えば「コメントの文字列を無視して、有効な1行を読み込む」と書いたときに
12345, /* the comment to be removed
*/ 456
って場合にどこからどこまでを「有効な1行」とするか, というのも含むよ.

変態としては
12345, /\
* comment? */
456
をどう処理するかとかも考えなきゃならん (C/C++ ではコメント処理の前に「\ による継続」を処理する). こんなアホは捨ておいていいと思うけど.
    • good
    • 0
この回答へのお礼

お付き合いありがとうございます

>「C コメント 削除 プログラム」ですね
ありがとう。

「コメント文字列を無視 数値データ読み込み関数 C」で検索して見たけど、あまりピッタリ来る検索結果が得られなくて質問していました。

今回、「どこまでがんばるのか」というと、

「コメントの文字列を無視して、有効な1行を読み込む」は、
 「//から\nまで」を読んで\nを文字列に書き込む、
 「/*から*/まで」を読んでスペースを書き込む
という簡単なもので、
 例にあげて頂いた「変態」の文字列は今回の目的では処理の対象外
という仕様の範囲での がんばり です。

#ということで、今回もまた、車輪の再発明のプログラム、書いちゃいました。

お礼日時:2022/10/05 22:18

> 大昔、Cコンパイラもどきを作ったときは、getToken関数内でコメントの呼び飛ばしやInclude文の処理やdefine文の処理などを行っていて、かなり大掛かりだったので、これらのソースもそれなりに大掛かりな気がしています。



あ〜、そうね。可能性は高いよね。

でもCコンパイラ作成経験があるんだったら、bisonとかflex辺りの字句解析/構文解析器生成ツールとか作って、フィルタ作っちゃうってのもテかなぁ。
コメント部分だけ読み飛ばせ、って事だからこれはこれで正攻法だとは思う。

http://kmaebashi.com/programmer/devlang/yacclex. …

あるいは、単純に、Python辺りにデータを渡して、そっちでフィルタリング -> コメントデータを省いたテキストファイル生成 -> 改めてC側で読ませる、とか?
Cだとsystem関数とかで外部プログラムとしてPythonで書いたスクリプトを呼び出して・・・とかやった方が意外と面倒ないかも。
    • good
    • 0
この回答へのお礼

お付き合いありがとうございます

>Cだとsystem関数とかで外部プログラムとしてPythonで書いたスクリプトを呼び出して・・・とかやった方が意外と面倒ないかも。

どうも貧乏症なので、そういった富豪的プログラミングは思いつきませんね。
アイデアありがとうございます

#今回こそは、どこかのコードを借用して再利用したいと思ったのですが、今回もまた、「コメントの文字列を無視して、有効な1行を読み込む関数」を自作した対処になってしまいました。

お礼日時:2022/10/05 22:28

どこまでがんばるのかって話はあるんじゃないかな. 究極的にはどこぞからプリプロセッサをもってくる (あるいは最初からプリプロセッサを呼び出す) ことになりそうだけど. というか, この程度なら検索すればいくらでも出てくるんじゃない?



「定番のソースリスト」はライセンスとのかねあいがあるから微妙かもよ. 特に GPL は感染力が強そうだし....
    • good
    • 0
この回答へのお礼

回答ありがとうございます

>この程度なら検索すればいくらでも出てくるんじゃない?
うまく検索できなかった、どうやって検索したら引っかかるのがわからないので、ここに質問したというのが正直なところです。

>どこまでがんばるのかって話はあるんじゃないかな.
そんなに頑張らなくても、
コメントの文字列を無視して、有効な1行を読み込む関数 getLine0(FILE *fd, char *str)
をまず作って、
 sscanf(str, FORMAT, 読み込む変数) 
で変数に読み込むのでしょうかね。

>「定番のソースリスト」はライセンスとのかねあいがあるから微妙かもよ.
言われてみればそうかもしれませんね。

ありがとうございました。

お礼日時:2022/10/05 15:56

> コメントは、C言語と同様、// 以降の行末までと /*  と */ で囲まれた部分



良く知らんのだけど、コメントがC言語と同様、って事はC言語処理系で読むのがラク、って意味になるんじゃないだろうか。
だとしたら、参考にすべきはCインタプリタの読み込み部分、って話になる可能性が高い。
オープンソースのCインタプリタとか探せばあると思うんで、そういうヤツのリーダー部分を参考にすれば?ってのが一つのアイディア。
例えば

igcc:
http://www.artificialworlds.net/wiki/IGCC/IGCC

とか、ソースコードをダウンロードしたり、githubに見に行けば良いと思う。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>参考にすべきはCインタプリタの読み込み部分、
なるほどですね。
参考にしたいです。

独り言:
大昔、Cコンパイラもどきを作ったときは、getToken関数内でコメントの呼び飛ばしやInclude文の処理やdefine文の処理などを行っていて、かなり大掛かりだったので、これらのソースもそれなりに大掛かりな気がしています。

お礼日時:2022/10/05 15:40

いきなりC言語で書いたコードを考えるのではなく「どういう手順で処理を行ったら自分がやりたいことができるか」を考える・・・つまり設計をすることが大切です。


テキストファイルを1行づつ読み込んでファイルの最後まで処理を行うのであれば、読み込んだ1行をどう処理すればコメント部分を除いたデータ部分を抽出できるかを考えればよいわけです。
それがわかればあとはその処理をファイルの最後が得られるまでループさせればよいと。

で、1行の構造としてどういう物があり得るのかも大切です。

(1) コメントが無い場合
(2) 1行全部がコメントの場合
(3) 行の先頭にデータがありその後ろにコメントがある場合
(4) 行の先頭にコメントがありその後ろにデータがある場合

また、行の先頭に任意の文字数の空白やタブ文字が有る場合、コメントとデータの間に任意の文字数の空白やタブ文字が有る場合、任意の文字数の空白やタブ文字が有る場合などに関する考慮も必要でしょう。
加えてコメントは/* */の場合と//の場合の両方をサポートするなら(4)以外は両方の場合がありえます。

といった辺りを頭に入れて1行読みこんだらどういう文字列をどういう順番で探して処理すると間違いなくデータを抽出できるかをC言語ではなく日本語で考えるわけです。

なお、データが数字という場合、1行の中のコメント以外の文字列が数字以外の文字であった場合の扱い(読み飛ばすのかエラーにしするのか)も決める必要がありますね。
数字であっても全角文字だったらどうするのかも。。。

参考まで。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます

おっしゃる通りの設計はできますし、コーディングも可能ですが、今回の質問は、
 この手の処理は汎用的なので、車輪の再発見になりそう
 なので、どこかに定番のソースリストなどありそう
なので、あれば教えてほしいという質問です。

よろしくお願いします。

お礼日時:2022/10/05 11:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報