読み込みたい数値データ以外にも、コメントの文字列が含まれている以下のようなテキストファイルがあります。
ここから、数値データだけを読み込む入力部のプログラムが作りたいです。
例:
/* テストデータ 計測日時 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も見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
あなたにとってのゴールデンタイムはいつですか?
一週間の中でもっともテンションが上がる「ゴールデンタイム」はいつですか? その逆で、一週間でもっとも落ち込むタイミングでも構いません。 よかったら教えて下さい!
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
c言語でのfscanfについて
C言語・C++・C#
-
数値のみ抽出(C言語)
C言語・C++・C#
-
C言語 exitの使い方
C言語・C++・C#
-
-
4
ファイル名に日付の挿入
C言語・C++・C#
-
5
絶対パスの取得について
C言語・C++・C#
-
6
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
7
改行を読み飛ばす
C言語・C++・C#
-
8
C言語でヘッダファイルにグローバル変数を宣言する
C言語・C++・C#
-
9
特定の文字列が一致する行から、文字列を抽出する方法
C言語・C++・C#
-
10
C言語のソースからコメントを抜出し、テキストに出力
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
EXCELVBAでSQLserverからデータ...
-
VBA 空白セルを削除ではない方...
-
メモ帳(テキストデータ)をExc...
-
この行は既に別のテーブルに属...
-
C言語の度数分布の問題
-
ユーザーフォームのテキストボ...
-
CString型の文字列連結について
-
エクセルで2つの時系列のデー...
-
S9タイプからXタイプにデータ...
-
パースとはなんですか?
-
ACCESSからEXCELに出力する際、...
-
FORTRANで区切りを無視する方法
-
VBでカードリーダ(USB)のイベ...
-
チェックサムとCRC
-
データ取得時のエラーに関して
-
大学のゼミのレポートがムカつ...
-
チェックサムの実装方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
カンマからスラッシュに
-
VBA 円グラフ 特定条件に一致し...
-
特定のデータの抽出方法を教え...
-
EXCELVBAでSQLserverからデータ...
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
エクセルで2つの時系列のデー...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
ACCESSからEXCELに出力する際、...
-
Accessで該当データにフラグを...
-
ユーザーフォームのテキストボ...
-
モジュラス103の算出方法について
-
S9タイプからXタイプにデータ...
-
ブレーカー落ちで壊れたりしな...
おすすめ情報
備忘録を兼ねて。コメント文字列を無視するコードです。
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 = '/';
}
}