- ベストアンサー
C言語のテキストファイルの読込み
必要に迫られてC言語でテキストファイルの読込みを行う プログラムを作成しなければならなくなりました。 whileとfscanfを用いて書式を指定して一行ずつ読込むことができる ということは知っていますが、その際、たとえば読み込むファイルが 20行のテキストファイルだったとして、10行目から読込みを 行いたい場合はどのようにプログラムを書けばいいのでしょうか? なにぶんC言語初心者ですのでよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
最初の質問内容とずれてきているようですが、大丈夫ですか? テキストファイルの10行目から、読み込む方法なら、 zenigataf 氏が、書かれている方法が普通です。 >改行文字'¥n'をカウントしておき、カウントが10になったら読み込むようにif文を使えば良いのでは? の回答は非常に妥当だと思います。 それとは、別に、パフォーマンスを要求するのであれば、 データ構造などにも、踏み込んでみる必要があります。 実際に使用するデータが ・20行のテキストデータで、10行目から読み込む。 と言うのが、運用上使う実データであるなら、 まず、実際にどれ位の速度が出るのか、計測してみる事をお勧めします。 例えば、入力されるテキストファイルを データ構造から見直して、固定長レコードのバイナリファイルなどに 出来るかも検討すると良いかもしれません。 固定長レコードのバイナリファイルにする事が可能なら、 ファイル処理は、速くなる事でしょう。 例えば、入力されるテキストファイルが、マスタデータなどで、 更新頻度が低い場合であれば、 テキストファイルにインデックスを貼る事によって、シーク処理の 高速化が可能かもしれません。
その他の回答 (3)
- cortotbach
- ベストアンサー率44% (8/18)
おそらく、ご質問の要求をもう一度整理されたほうが良いのかもしれません。 テキストの読み込み処理で行単位で行う、2つの関数間で相互に読み込みを行う、whileとfscanfという使う関数を指定されているのが条件でありながら、リアルタイムという高速性を求めておられます。 まず、ご質問の内容で、main関数が終わってA関数という動作はリアルタイムというよりは同期的な動作です。おそらく”早さ”の意味でリアルタイムをお使いになっていると思われますが、それであれば、一度ファイルをメモリに全部取り込んでしまう(現代のPCならメモリはふんだんにあるでしょうし)、下の方の述べているようなテキストではなくバイナリファイルで扱うというなどの方法で対応するほうが良いのかもしれません。 回答ベタですが、本当に高速性を求めるならテキストファイルでscanfを二つの関数で順番に読むという条件を解体した方が良いかと思います。また下の方も述べていますが、ファイルのオープンもバッファがありますので、十分な速度は出ていると思います。この速度をより早くというのであれば、上記のようなメモリに取り込むなり、同期オブジェクトを使うなり方法があるのかなと思いました。 全く回答になってなくて申し訳ないです。 蛇足ですが、10行目の処理をscanfでというのであれば、\nの改行文字を10回カウントする以上に早い方法はないですよ。
お礼
丁寧にありがとうございます。 初心者すぎて自分の質問すらもうまくまとめきれずすみませんでした。 二つの関数を相互に読み込む方法を使わずに解決(?)する方法を 知人が教えてくれたのでプログラムはできました。 ありがとうございました。
- zenigataf
- ベストアンサー率13% (7/52)
改行文字'¥n'をカウントしておき、カウントが10になったら読み込むようにif文を使えば良いのでは?
お礼
回答ありがとうございます。 説明が足らなかった部分がありました。 可能な限り遅延をなくしたいのです。 というのも、実際はmain関数ともうひとつ別の関数Aを用意して main内でwhileとfscanfで読み込みを行っていき ある条件を満たしたとき、今読んでいる行の次の行から 関数A内でwhileとfscanfで読込みを再開する そして、関数A内である条件を満たしたとき A内で今読んでいる行の次の行からmain関数内で 読込みを再開する という風に二つの関数でループを使ってリアルタイム的に ファイルの読込みを行いたいと思っています。 なので\nのカウント方式では遅延がでてしまいますよね。 よろしければ以上のことを考慮した上でお答えいただけると 助かります。
- zenigataf
- ベストアンサー率13% (7/52)
改行文字'¥n'をカウントしておき、カウントが10になったら読み込むようにif文を使えば良いのでは?
お礼
丁寧にありがとうございます。 初心者すぎて自分の質問すらもうまくまとめきれずすみませんでした。 二つの関数を相互に読み込む方法を使わずに解決(?)する方法を 知人が教えてくれたのでプログラムはできました。 ありがとうございました。