- 締切済み
ファイルからサイズ不明の行データを読み込む場合
C言語でファイルからデータを読み込み、そのデータを編集しファイルに出力する というプログラムを作成しています。 ファイルデータはfgetsを使用し、読み込んでいます。 そこでお聞きしたいのですが現在、ファイル1行の最大サイズが不明のためfgetsで設定する 文字サイズをかなり大きくとってあります。 (とりあえず確認できた最大サイズが4000バイトだったので保険もかねて20000バイトを 設定しています) やはり文字サイズを大きくすると性能等に影響があるのでしょうか? また、ファイル1行の最大サイズが不明の場合、通常どのようにファイルを読み込むべき なのでしょうか? ご回答の方よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- SONICLA
- ベストアンサー率100% (2/2)
すみません。No.4の訂正です。 > fwriteなどでまとまったサイズを~ 正しくはfreadでした^^;
- SONICLA
- ベストアンサー率100% (2/2)
仕様を決めないと必ずぶちあたる問題です。 1行のサイズを仕様で4000Byteまで、とか決めないと、例えば破損したファイルとか間違えてバイナリファイルを指定したとかで改行がなかったりしたら、対応しようがないからです。 仕様を決められるのであれば、あとはエラー判定の仕方を考えれば良いだけですから。 それとファイルの末端行にもちゃんと改行が入るべきかどうかも考慮しておく必要があります。 fgetsで読めた範囲に改行ないからといって、続きがあるとは限りません(ファイルの最後に改行を入れていない可能性もある)から。 この手の処理をなんでも対応できるようにし、かつ性能面も踏まえると、fwriteなどでまとまったサイズをファイルから読み込み、メモリ上で1文字単位のチェックを行っていく必要が出てきます。 全ては仕様で左右されるかと思います。
- kmee
- ベストアンサー率55% (1857/3366)
サイズが大きくなれば ・領域を確保するための処理が多くなる ・仮想メモリ空間を使っているシステムの場合、スワッピングが発生することがある ということで、遅くなる可能性はあります。 昨今のGBオーダーのメモリで20kB程度では、目に見える影響は無いでしょう。 fgetsは改行文字まで含めて読み込むことを利用して 読み込んだ文字列の最後が改行でなかったら、バッファを拡張、続きを読み込んで前回分に結合する という方法があります。
- davidfox
- ベストアンサー率58% (21/36)
>保険もかねて20000バイトを設定しています) ならば20000バイトが仕様とすれば済むのでないでしょうか? それ以上の行は仕様外、エラーです。 ファイルとして扱えるサイズを仕様としたければ、編集処理が1度に行を読み込めなくても処理出来るように作る必要があります。 そうなれば fgets を繰り返し呼び出せば済むと思います。
- wormhole
- ベストアンサー率28% (1626/5665)
>また、ファイル1行の最大サイズが不明の場合、通常どのようにファイルを読み込むべきなのでしょうか? 簡単に思いつくのは、1文字ずつ読み込んで行バッファをrealloc()で確保拡張してく。