読み込みたい数値データ以外にも、コメントの文字列が含まれている以下のようなテキストファイルがあります。
ここから、数値データだけを読み込む入力部のプログラムが作りたいです。
例:
/* テストデータ 計測日時 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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# C言語について教えて欲しいです。 ファイルの中身をコピーするプログラムを作ってます aというファイル 7 2022/11/03 19:21
- その他(プログラミング・Web制作) プログラミング python pandas 固定長データの出力 2 2022/08/16 11:22
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
お風呂の温度、何℃にしてますか?
みなさん、家のお風呂って何℃で入ってますか? ぬるめのお湯にゆったり…という方もいれば、熱いのが好き!という方もいるかと思います。 我が家は平均的(?)な42℃設定なのですが、みなさんのご家庭では何℃に設定していますか?
-
c言語でのfscanfについて
C言語・C++・C#
-
数値のみ抽出(C言語)
C言語・C++・C#
-
C言語 exitの使い方
C言語・C++・C#
-
-
4
ファイル名に日付の挿入
C言語・C++・C#
-
5
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
6
絶対パスの取得について
C言語・C++・C#
-
7
改行を読み飛ばす
C言語・C++・C#
-
8
C言語初心者の質問失礼します。
C言語・C++・C#
-
9
C言語でヘッダファイルにグローバル変数を宣言する
C言語・C++・C#
-
10
特定の文字列が一致する行から、文字列を抽出する方法
C言語・C++・C#
-
11
C言語のソースからコメントを抜出し、テキストに出力
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
多量のSUMIF式を軽くしたい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
S9タイプからXタイプにデータ...
-
VBA 空白セルを削除ではない方...
-
Accessで該当データにフラグを...
-
この行は既に別のテーブルに属...
-
カンマからスラッシュに
-
EXCELVBAでSQLserverからデータ...
-
配列の勉強をしています。使用...
-
メモ帳(テキストデータ)をExc...
-
VBAを使ってOutlookメール本文...
-
マクロで同じフォルダにある画...
-
Excelが取り込めるのは何行まで...
-
SASの時間比較
-
独自データ属性に日本語は利用...
-
Setステートメントをまとめて記...
-
ユーザーフォームのテキストボ...
-
エクセルのVBA メッセージボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
多量のSUMIF式を軽くしたい
-
EXCELVBAでSQLserverからデータ...
-
VBA 空白セルを削除ではない方...
-
VBA 円グラフ 特定条件に一致し...
-
この行は既に別のテーブルに属...
-
カンマからスラッシュに
-
[C言語] コメント文字列を無視...
-
特定のデータの抽出方法を教え...
-
<VB>String→Object
-
S9タイプからXタイプにデータ...
-
エクセルで2つの時系列のデー...
-
C# ソケット通信でデータ受信時...
-
CString型の文字列連結について
-
ユーザーフォームのテキストボ...
-
プログラミング python pandas ...
-
ページ数を求めたい
おすすめ情報
備忘録を兼ねて。コメント文字列を無視するコードです。
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 = '/';
}
}