• ベストアンサー

C言語のテキストファイルの読込み

必要に迫られてC言語でテキストファイルの読込みを行う プログラムを作成しなければならなくなりました。 whileとfscanfを用いて書式を指定して一行ずつ読込むことができる ということは知っていますが、その際、たとえば読み込むファイルが 20行のテキストファイルだったとして、10行目から読込みを 行いたい場合はどのようにプログラムを書けばいいのでしょうか? なにぶんC言語初心者ですのでよろしくお願いします。

  • e5523
  • お礼率75% (6/8)

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

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

最初の質問内容とずれてきているようですが、大丈夫ですか? テキストファイルの10行目から、読み込む方法なら、 zenigataf 氏が、書かれている方法が普通です。 >改行文字'¥n'をカウントしておき、カウントが10になったら読み込むようにif文を使えば良いのでは? の回答は非常に妥当だと思います。 それとは、別に、パフォーマンスを要求するのであれば、 データ構造などにも、踏み込んでみる必要があります。 実際に使用するデータが ・20行のテキストデータで、10行目から読み込む。 と言うのが、運用上使う実データであるなら、 まず、実際にどれ位の速度が出るのか、計測してみる事をお勧めします。 例えば、入力されるテキストファイルを データ構造から見直して、固定長レコードのバイナリファイルなどに 出来るかも検討すると良いかもしれません。 固定長レコードのバイナリファイルにする事が可能なら、 ファイル処理は、速くなる事でしょう。 例えば、入力されるテキストファイルが、マスタデータなどで、 更新頻度が低い場合であれば、 テキストファイルにインデックスを貼る事によって、シーク処理の 高速化が可能かもしれません。

e5523
質問者

お礼

丁寧にありがとうございます。 初心者すぎて自分の質問すらもうまくまとめきれずすみませんでした。 二つの関数を相互に読み込む方法を使わずに解決(?)する方法を 知人が教えてくれたのでプログラムはできました。 ありがとうございました。

その他の回答 (3)

回答No.4

おそらく、ご質問の要求をもう一度整理されたほうが良いのかもしれません。 テキストの読み込み処理で行単位で行う、2つの関数間で相互に読み込みを行う、whileとfscanfという使う関数を指定されているのが条件でありながら、リアルタイムという高速性を求めておられます。 まず、ご質問の内容で、main関数が終わってA関数という動作はリアルタイムというよりは同期的な動作です。おそらく”早さ”の意味でリアルタイムをお使いになっていると思われますが、それであれば、一度ファイルをメモリに全部取り込んでしまう(現代のPCならメモリはふんだんにあるでしょうし)、下の方の述べているようなテキストではなくバイナリファイルで扱うというなどの方法で対応するほうが良いのかもしれません。 回答ベタですが、本当に高速性を求めるならテキストファイルでscanfを二つの関数で順番に読むという条件を解体した方が良いかと思います。また下の方も述べていますが、ファイルのオープンもバッファがありますので、十分な速度は出ていると思います。この速度をより早くというのであれば、上記のようなメモリに取り込むなり、同期オブジェクトを使うなり方法があるのかなと思いました。 全く回答になってなくて申し訳ないです。 蛇足ですが、10行目の処理をscanfでというのであれば、\nの改行文字を10回カウントする以上に早い方法はないですよ。

e5523
質問者

お礼

丁寧にありがとうございます。 初心者すぎて自分の質問すらもうまくまとめきれずすみませんでした。 二つの関数を相互に読み込む方法を使わずに解決(?)する方法を 知人が教えてくれたのでプログラムはできました。 ありがとうございました。

  • zenigataf
  • ベストアンサー率13% (7/52)
回答No.2

改行文字'¥n'をカウントしておき、カウントが10になったら読み込むようにif文を使えば良いのでは?

e5523
質問者

お礼

回答ありがとうございます。 説明が足らなかった部分がありました。 可能な限り遅延をなくしたいのです。 というのも、実際はmain関数ともうひとつ別の関数Aを用意して main内でwhileとfscanfで読み込みを行っていき ある条件を満たしたとき、今読んでいる行の次の行から 関数A内でwhileとfscanfで読込みを再開する そして、関数A内である条件を満たしたとき A内で今読んでいる行の次の行からmain関数内で 読込みを再開する という風に二つの関数でループを使ってリアルタイム的に ファイルの読込みを行いたいと思っています。 なので\nのカウント方式では遅延がでてしまいますよね。 よろしければ以上のことを考慮した上でお答えいただけると 助かります。

  • zenigataf
  • ベストアンサー率13% (7/52)
回答No.1

改行文字'¥n'をカウントしておき、カウントが10になったら読み込むようにif文を使えば良いのでは?

関連するQ&A

  • C言語でテキストファイルのデータ処理

    はじめまして。 僕はC言語に関して全くの初心者です。 どうぞよろしくお願いします。 例えば、 1,0,0,7,6 2,0,0,5,5 3,1,0,4,9 : : のようなテキストファイル、test.txtがある時、 1行目の4カラム目(7)と5カラム目(6)を、 それぞれの行について差し引くプログラム、 つまり全ての行について4カラム目は7を引き、 5カラム目は6を引くプログラムの事で、 この例では、 1,0,0,0,0 2,0,0,-2,-1  3,1,0,-3,-3 : : となるようなプログラムを書き、結果を出力したいのですが、よく分かりません。 ちなみにawkで書いて実行すると、 (プログラム名はtest.awkとする) BEGIN{ i=0; } { while(i<1){ v3 = $4; v4 = $5; i++; } print $1,$2,$3,($4 - v3),($5 - v4); } 実行するプログラム↓ awk -f test.awk test.txt という感じなのですが…。 これを上述の様に、C言語でプログラムを書いて、 実行するには、例えばどのようなプログラムを書けば いいのでしょうか? なにぶん初心者のため、分からない事だらけですが、 よろしくお願いしますm(__)m

  • C言語での、テキストファイル読み込みについて

    30行×30列の数字が記載されてテキストファイルがあり、 それをC言語で例えばA[ ][ ]といった配列に読み込みたいのですが、 どうすればよいでしょうか? fscanf関数を用いればできないことはないと思うのですが、 30個も書かなければならないのは冗長なので・・・。 なにかよい方法はありますでしょうか?

  • C言語のバイナリモードでのfscanf関数の使い方について教えて下さい

    C言語のバイナリモードでのfscanf関数の使い方について教えて下さい。 2*2のint型配列バイナリデータを読み込んで、要素一つ一つを出力したいのですが、 fscanfでの書式指定の仕方がよく分かりません。 fscanf(入力元,"???",&入力先)の???の部分はどう指定すればよいのでしょうか? 下記のようなプログラムを書いたのですが、fscanfでデータを読み込めず、 data=0という出力で無限ループに入ってしまいます。 C言語初心者なので、かなり初歩的な質問かと思いますが、 よろしくお願いします。 -------------------------------------- char *fi; int data; fi = argv[1]; /* 2x2のint型配列バイナリデータを指定 */ input = fopen(fi,"rb"); while(!feof(input)){ fscanf(input,"%d",&data); printf("data=%d\n",data); } ---------------------------------------

  • c言語でのfscanfについて

    例えば ------------------ ほげほげ1 ほげほげ2 1,2 2,4 3,8 4,16 ------------------ というデータファイルがあったとき3行目からのデータだけを抽出するにはc言語のfscanfでどのように書けばいいでしょうか? 簡単にでかまわないので、どなたか教えてください。

  • C言語についてです。

    C言語についてです。 次のようなテキストファイルがあるとします。 ------------------------------------- Sample.txt ------------------------------------- 項目一  項目二  項目三 1      2     1 2      1     3 3      3     1 ------------------------------------- 一行目が文字列、2行目以降が整数というファイルです。 このファイルを読み込み、1行目の文字列を表示し、2行目以降を読み込んでn行3列の配列に入れ更に表示したいのですが、どのように書けばいいのでしょうか? 宜しくお願いします。

  • テキストファイルについて

     ご教授お願い致します。  あるレコードを自動でテキストファイルへ書きこむ作業がありまして  テキストファイルの保存先名の指定はできるのですが  タイトルをテキスト行の一行目につけたいとの要望がありました。  そのレコードのみの書き込みのため一行目に何の題名かが  自動で表示できればいいとの要望でした。  よって、保存先名を指定の場所でファイル名を作成すると同時に  一行目に指定した題名をつけることが可能でしょうか?  ぜひ、ご回答お願い致します。  

  • テキストファイルを配列に

    始めまして C言語にてテキストファイルの中身を読み込み一次元配列に代入するというシステムを作ろうとしているのですがわかりません テキストファイルの中身は 12 5312 72 7 444 53 7884 といった具合で100数行あり一行ごとに配列に入れたいです 勉強を始めたばっかりで本を見ても書いていなく困っています わかるかたご指導願えますか? よろしくお願いいたします

  • 2つのファイルを比較するC言語プログラムについて

    はじめまして、C言語プログラミングについて質問です。 2つのファイルの内容を比較するプログラムをC言語で作成する方法 について教えて頂けますでしょうか? 2つのファイルをそれぞれオープンした後、ファイルの先頭から1行ずつ読み込んで比較し、 違いがあればその行を画面表示するという動作をさせたいと考えて おります。

  • 初心者のC言語

    私は、昨日からC言語を勉強し始めました。 大学の教授から2週間以内に50行程度のCプログラムを書けるようになって こいと指示を受けましたが、C言語をやったことが無いので、どのような勉強を すればいいのか分かりません。 初心者にも分かりやすいC言語のテキストやサイトを知っている方がいれば 教えてください。 お願いします。

  • テキストファイルについてのプログラム

    初めまして、VC++2005を使っているプログラム初心者です。 windowsフォームアプリケーションというテンプレートを使ってプログラムを作成したいと考えているのですが、どのようにすればよいのかわからず質問しました。ご指導していただけると嬉しいです。 まず、test.txtというテキストファイルの中に以下の内容があります。 8:00  朝食 12:00 昼食 15:00 おやつ 19:00 夕食 というデータです。 このデータをボタンをクリックするとテキストファイルを1行ずつ読んで行き、15:00という文字が出たらテキストボックスに「おやつの時間」というものを表示する方法とまたそのテキストファイルの内容全体を別のテキストボックスに表示したいのですが、どのようにすればよいのでしょうか? fscanfやfopenなどを使うのですが、どうしてもうまくいかないのでよろしくお願いします。

専門家に質問してみよう