
読み込みたい数値データ以外にも、コメントの文字列が含まれている以下のようなテキストファイルがあります。
ここから、数値データだけを読み込む入力部のプログラムが作りたいです。
例:
/* テストデータ 計測日時 2022.10.1 - 10.5
*/
100,65 // 最大値と平均値
2000 // サンプル数
:
これらのコメントの文字列を無視して、数値データを読み込むプログラム部分について教えてください。
コメントは、C言語と同様、// 以降の行末までと /* と */ で囲まれた部分です。
この種の入力プログラムのコーディングは難しいものでは無いとは思いましたが、車輪の再発見になりそうなので、質問しました。
定番のソースリストなどあれば、参考にしたいと思いますのでご教示、お願いします。
No.4ベストアンサー
- 回答日時:
「検索する」ってのはもちろんうまい「検索ワード」を選ばないといけないわけだけど, 例えばわたしのところでは
「C コメント 削除 プログラム」
で検索するといくつかコードがいくつか出てくるんだ.
「どこまでがんばるのか」ってのは, 例えば「コメントの文字列を無視して、有効な1行を読み込む」と書いたときに
12345, /* the comment to be removed
*/ 456
って場合にどこからどこまでを「有効な1行」とするか, というのも含むよ.
変態としては
12345, /\
* comment? */
456
をどう処理するかとかも考えなきゃならん (C/C++ ではコメント処理の前に「\ による継続」を処理する). こんなアホは捨ておいていいと思うけど.
お付き合いありがとうございます
>「C コメント 削除 プログラム」ですね
ありがとう。
「コメント文字列を無視 数値データ読み込み関数 C」で検索して見たけど、あまりピッタリ来る検索結果が得られなくて質問していました。
今回、「どこまでがんばるのか」というと、
「コメントの文字列を無視して、有効な1行を読み込む」は、
「//から\nまで」を読んで\nを文字列に書き込む、
「/*から*/まで」を読んでスペースを書き込む
という簡単なもので、
例にあげて頂いた「変態」の文字列は今回の目的では処理の対象外
という仕様の範囲での がんばり です。
#ということで、今回もまた、車輪の再発明のプログラム、書いちゃいました。
No.5
- 回答日時:
> 大昔、Cコンパイラもどきを作ったときは、getToken関数内でコメントの呼び飛ばしやInclude文の処理やdefine文の処理などを行っていて、かなり大掛かりだったので、これらのソースもそれなりに大掛かりな気がしています。
あ〜、そうね。可能性は高いよね。
でもCコンパイラ作成経験があるんだったら、bisonとかflex辺りの字句解析/構文解析器生成ツールとか作って、フィルタ作っちゃうってのもテかなぁ。
コメント部分だけ読み飛ばせ、って事だからこれはこれで正攻法だとは思う。
http://kmaebashi.com/programmer/devlang/yacclex. …
あるいは、単純に、Python辺りにデータを渡して、そっちでフィルタリング -> コメントデータを省いたテキストファイル生成 -> 改めてC側で読ませる、とか?
Cだとsystem関数とかで外部プログラムとしてPythonで書いたスクリプトを呼び出して・・・とかやった方が意外と面倒ないかも。
お付き合いありがとうございます
>Cだとsystem関数とかで外部プログラムとしてPythonで書いたスクリプトを呼び出して・・・とかやった方が意外と面倒ないかも。
どうも貧乏症なので、そういった富豪的プログラミングは思いつきませんね。
アイデアありがとうございます
#今回こそは、どこかのコードを借用して再利用したいと思ったのですが、今回もまた、「コメントの文字列を無視して、有効な1行を読み込む関数」を自作した対処になってしまいました。
No.3
- 回答日時:
どこまでがんばるのかって話はあるんじゃないかな. 究極的にはどこぞからプリプロセッサをもってくる (あるいは最初からプリプロセッサを呼び出す) ことになりそうだけど. というか, この程度なら検索すればいくらでも出てくるんじゃない?
「定番のソースリスト」はライセンスとのかねあいがあるから微妙かもよ. 特に GPL は感染力が強そうだし....
回答ありがとうございます
>この程度なら検索すればいくらでも出てくるんじゃない?
うまく検索できなかった、どうやって検索したら引っかかるのがわからないので、ここに質問したというのが正直なところです。
>どこまでがんばるのかって話はあるんじゃないかな.
そんなに頑張らなくても、
コメントの文字列を無視して、有効な1行を読み込む関数 getLine0(FILE *fd, char *str)
をまず作って、
sscanf(str, FORMAT, 読み込む変数)
で変数に読み込むのでしょうかね。
>「定番のソースリスト」はライセンスとのかねあいがあるから微妙かもよ.
言われてみればそうかもしれませんね。
ありがとうございました。
No.2
- 回答日時:
> コメントは、C言語と同様、// 以降の行末までと /* と */ で囲まれた部分
良く知らんのだけど、コメントがC言語と同様、って事はC言語処理系で読むのがラク、って意味になるんじゃないだろうか。
だとしたら、参考にすべきはCインタプリタの読み込み部分、って話になる可能性が高い。
オープンソースのCインタプリタとか探せばあると思うんで、そういうヤツのリーダー部分を参考にすれば?ってのが一つのアイディア。
例えば
igcc:
http://www.artificialworlds.net/wiki/IGCC/IGCC
とか、ソースコードをダウンロードしたり、githubに見に行けば良いと思う。
回答ありがとうございます。
>参考にすべきはCインタプリタの読み込み部分、
なるほどですね。
参考にしたいです。
独り言:
大昔、Cコンパイラもどきを作ったときは、getToken関数内でコメントの呼び飛ばしやInclude文の処理やdefine文の処理などを行っていて、かなり大掛かりだったので、これらのソースもそれなりに大掛かりな気がしています。
No.1
- 回答日時:
いきなりC言語で書いたコードを考えるのではなく「どういう手順で処理を行ったら自分がやりたいことができるか」を考える・・・つまり設計をすることが大切です。
テキストファイルを1行づつ読み込んでファイルの最後まで処理を行うのであれば、読み込んだ1行をどう処理すればコメント部分を除いたデータ部分を抽出できるかを考えればよいわけです。
それがわかればあとはその処理をファイルの最後が得られるまでループさせればよいと。
で、1行の構造としてどういう物があり得るのかも大切です。
(1) コメントが無い場合
(2) 1行全部がコメントの場合
(3) 行の先頭にデータがありその後ろにコメントがある場合
(4) 行の先頭にコメントがありその後ろにデータがある場合
また、行の先頭に任意の文字数の空白やタブ文字が有る場合、コメントとデータの間に任意の文字数の空白やタブ文字が有る場合、任意の文字数の空白やタブ文字が有る場合などに関する考慮も必要でしょう。
加えてコメントは/* */の場合と//の場合の両方をサポートするなら(4)以外は両方の場合がありえます。
といった辺りを頭に入れて1行読みこんだらどういう文字列をどういう順番で探して処理すると間違いなくデータを抽出できるかをC言語ではなく日本語で考えるわけです。
なお、データが数字という場合、1行の中のコメント以外の文字列が数字以外の文字であった場合の扱い(読み飛ばすのかエラーにしするのか)も決める必要がありますね。
数字であっても全角文字だったらどうするのかも。。。
参考まで。
早速の回答ありがとうございます
おっしゃる通りの設計はできますし、コーディングも可能ですが、今回の質問は、
この手の処理は汎用的なので、車輪の再発見になりそう
なので、どこかに定番のソースリストなどありそう
なので、あれば教えてほしいという質問です。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C言語
C言語・C++・C#
-
C言語について質問です。 以下のような結果を出すためにはどのようなコードが良いですか?サンプルコード
C言語・C++・C#
-
プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし
C言語・C++・C#
-
4
C++アンインストールの影響
C言語・C++・C#
-
5
C++はWindows運用に必須なのか
C言語・C++・C#
-
6
C言語について。
C言語・C++・C#
-
7
C言語で移動平均のプログラムを作りたいのですが、数値をファイルから取ってきて計算をするプログラムはど
C言語・C++・C#
-
8
C言語について教えて欲しいです。 ファイルの中身をコピーするプログラムを作ってます aというファイル
C言語・C++・C#
-
9
C言語 少しの疑問
C言語・C++・C#
-
10
プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) {
C言語・C++・C#
-
11
コールとリンク違いについて。
C言語・C++・C#
-
12
プログラム例え話について。
C言語・C++・C#
-
13
C言語: ポインタ
C言語・C++・C#
-
14
C言語 配列とポインタについて
C言語・C++・C#
-
15
コンピュータでいう「割り込み」とはどういう意味ですか?わかりやすく教えてほしいです。
C言語・C++・C#
-
16
str[j++]の意味
C言語・C++・C#
-
17
ご本について 著者は、Linuxでも、言語と、フレームワークが同じの場合、大丈夫とおもいますか?
C言語・C++・C#
-
18
変数の初期化について
C言語・C++・C#
-
19
C言語の質問です、プログラミング初心者です このような文字列があった場合 abcdef☆ghijk"
C言語・C++・C#
-
20
参考にいろいろとc言語、c++言語プログラミングでレジストリーを操作したいのですが、無料配布のc++
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
異なるプログラミング言語を連...
-
5
あっち向いてホイのプログラム...
-
6
プログラム 擬似コードとはどん...
-
7
Excelでのセル内容の高速消去方法
-
8
プログラム上のCPU稼働率低減に...
-
9
ExcelVBA処理経過をリアルタイ...
-
10
DoEvents関数って何?
-
11
C言語 再帰処理のメリットとデ...
-
12
Cのプログラムに無性にイライラ...
-
13
他サイト数値を自サイトに反映...
-
14
ノットイコールを教えて下さい
-
15
If Not c Is Nothing Then ~延...
-
16
実行時のCPU使用率を増やしたい
-
17
VBA
-
18
Macターミナルで実行中のプログ...
-
19
緯度、経度の 10進法と 60進法...
-
20
C/C++→JAVAに変換するツール
おすすめ情報
公式facebook
公式twitter
備忘録を兼ねて。コメント文字列を無視するコードです。
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 = '/';
}
}