- 締切済み
ファイルポインタfpを、何バイト読んだかカウンタとして使うには?
ファイルポインタfpを、何バイト読んだかカウンタとして使うには?どうしたら良いか教えてください。binary fileをオープンして、1Byteずつc=fgetc(fp); を繰り返し読込み特定の処理します。数百万バイトを読んだあたりで、こけるので、何バイト目あたりでこけているのか知りたいというのが動機です。 fp構造体の中で、今、ファイルの冒頭から何バイト読んだところ、という情報を引っ張り出して1Byte読み込むごとに(ずらずらとでいいので)表示したいです。fp->current_byte とかいう情報があるように想像するのですが、どうでしょうか。以下に、#include<stdio.h>の中で、FILE を引用します。 typedef struct { unsigned char *curp; /* Current active pointer */ unsigned char *buffer; /* Data transfer buffer */ int level; /* fill/empty level of buffer */ int bsize; /* Buffer size */ unsigned short istemp; /* Temporary file indicator */ unsigned short flags; /* File status flags */ wchar_t hold; /* Ungetc char if no buffer */ char fd; /* File descriptor */ unsigned char token; /* Used for validity checking */ } FILE; /* This is the FILE object */
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- a-kuma
- ベストアンサー率50% (1122/2211)
> ファイルサイズが 数百万バイトということであれば、ftell() の返り値が long なので、使えませんね。 何を書いてるんだ、あたしゃあ。 No.2 の回答のように、十分足りてますね m(_ _)m
- toysmith
- ベストアンサー率37% (570/1525)
ANSI C(C89)の場合。 ・int fseek(FILE *stream, long offset, int whence); ファイルポインタ移動関数だが移動させなければ現在位置が関数値として戻される ・int fgetpos(FILE *stream, fpos_t *pos); fseek(stream, 0,SEEK_SET)と同じ動作だが、関数値ではなくposに設定される fpos_tはファイルポインタの最大値を収めることのできる型として定義される ・long ftell(FILE *stream); 現在位置を関数値として報告するだけ longが32ビットの処理系でファイルサイズが2Gバイト以下ならlong ftell(FILE *)を使うのがまっとうな方法です。 ファイルポインタの最大値がlongに収まらないようならint fgetpos(FILE *stream, fpos_t *pos)ですね。 FILE構造体の構成は処理系依存なので、メンバ変数の用途はわかりません。 メンバ変数が存在しても利用されていない場合もあります。
お礼
ありがとうございます。実は、必要に迫られてご回答を見る前に、実装しました。それは偶然No.1の方のと同じ方法でした。No.2のご回答でお教えいただいたftellを知り、早速それもやってみると、うれしいことに同じ結果になりました。検算のように使えとても安心ました。ftell(fp)だと、一層すっきりしますし、簡便と思いました。ファイルポインタがlongの範囲を超えても、fgetpos()という関数が用意されているということが心強いです。ところで、どうやって、longの範囲を超えた値を調べるのかとか、fgetpos()の具体的な使用法を知りたくなってきました。
- a-kuma
- ベストアンサー率50% (1122/2211)
ANSI の範囲では ftell() というライブラリがこの用途に使えるのですが、ファイルサイズが 数百万バイトということであれば、ftell() の返り値が long なので、使えませんね。 FILE の中をのぞくようなトリッキーなことをせず、カウンター用の変数を用意(*)しておいて fgetc() する度に +1 しましょう。 (*) カウンター用の変数も long では足りないですね
お礼
ありがとうございます。詳しい人も、勘違いすることもある箇所の付近ということから、雰囲気が一層よく理解できたように思います。