• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイルの統合プログラム)

ファイルの統合プログラム

このQ&Aのポイント
  • ファイルの内容を統合し、特定の条件に一致する行だけを抜き出すプログラムを作成したいです。
  • ここでは3つのファイルを統合し、aaa.txtの一列目の文字列とbbb.txt,ccc.txtの一列目の文字列が一致する行だけを抜き出します。
  • これまではcolumnの変数を一つ一つ定義して書いていたが、今回はcolumnの数が多いため、columnの数がわからなくてもファイルを読み込めば処理を行えるプログラムを作りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

aaa.txtの1列目しか比較項目として使わないのであれば、2列目以降はまとめて読み込めばいいでしょう。 fscanfとfgetsを併用すれば可能です。 書かれているプログラムをfscanfとfgetsを使ったプログラムに修正すると次のようになります。 while(fscanf(fp,"%s%s",xls,nx2)==2){ while(fscanf(gp,"%s",nx1)==1){ fgets(xl,256,gp); ret=strcmp(xls,nx1); if(ret == 0){ printf("%s\t%s\t%s%s\n",xls,nx2,nx1,xl); } } rewind(gp); } なお、xlのサイズは十分に大きく取っておいてください。 ファイルがaaa.txt,bbb.txt,ccc.txtの3つに増えた場合は、 まず、aaa.txt,bbb.txtの2つのファイルで上記の処理をして結果を一時ファイルに出力し、 さらに、その一時ファイルとccc.txtとの処理で結果を出力すればいいでしょう。 ただ、#1さんも書いていますが、メモリ上に読み込めるほどのデータ量なら、全件読み込んでから処理したほうが簡単だし処理時間も早くなります。

seturi38
質問者

お礼

なるほどやってみます. ありがとうございました.

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

まず確認ですが、 ・その処理ができるようにするのが目的で、C言語は手段ですか? ・C言語をマスターするのが目的で、その処理は手段ですか? 「columnの変数を一つ一つ定義して書く」などというのは面倒なので、多次元配列を用意するのが常套手段でしょう。 char data[100][30] data[0] : 0番目のカラムの文字列 data[1] : 1番目のカラムの文字列 といった具合。 また、数がわからなければ、最初行でカラム数を求めて、その後、malloc/callocなどで動的にメモリを確保する、という方法があります。 また、同じファイルを繰り返し読んでますが、メモリに余裕があれば、メモリ上の読み込んでしまうという方法もあります。 上記と合せて、char data[行][列][文字] のような3次元配列に入れることもできます。 C言語の勉強が目的なら、このようなメモリ関連の処理は非常に重要なものです。 これを避けてマスターするなどできません。 しっかりと学習してください。 ファイル処理が目的なら、C言語の文字列操作は面倒です。 他の文字列を得意とする言語、例えば、Awk, Perl ,Ruby,Python等でやることをお勧めします。 Visual BasicやExcelのVBAとかでも、Cよりははるかに楽です。

seturi38
質問者

お礼

早速の回答有り難うございます. 私は、質問に書いたような処理がしたいと考え,ちょうどc言語を勉強し始めたのでこの機会にcで書いてみようと思いました. >また、数がわからなければ、最初行でカラム数を求めて、その後、malloc/callocなどで動的にメモリを確保する、という方法があります。 「最初行でカラム数・・・」というのはどのようにすれば実現できるのでしょうか?

関連するQ&A