ファイルポインタ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 */
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
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()の具体的な使用法を知りたくなってきました。
No.1
- 回答日時:
ANSI の範囲では ftell() というライブラリがこの用途に使えるのですが、ファイルサイズが
数百万バイトということであれば、ftell() の返り値が long なので、使えませんね。
FILE の中をのぞくようなトリッキーなことをせず、カウンター用の変数を用意(*)しておいて
fgetc() する度に +1 しましょう。
(*) カウンター用の変数も long では足りないですね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# 略語の読み方について 2 2023/05/25 12:35
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# 100バイトのバイナリファイルを読み込んで別のファイルに書き込みたいのですが、型をどうすればいいのか 1 2022/11/03 17:11
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
main(int argc,char **argv[])...
-
CImage GetBitsメソッドについて
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
C言語を勉強しています。
-
ポインタについて
-
NULLポインタが0でない処理系と...
-
関数宣言時の引数の*&はどうい...
-
変数
-
Cで作成したDLL関数をVBから呼...
-
C言語の初心者です。
-
fopne で失敗する原因
-
配列とポインタの違いについて
-
構造体のメンバーのメモリ確保
-
#define NULL ((void *)0) の弊害
-
関数へのポインタ渡し
-
関数の引数をvoid*でキャストする
-
C言語について教えてください。
-
C言語次のステップ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語の関数と配列に関する質問
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
構造体とfscanf
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
DLL<->VB間での受け渡し(文字...
-
PASCALとFARの意味
-
エラーの意味
-
ハンドルはポインタか
-
TCHAR文字列内の検索について
おすすめ情報