ページ 1 / 1
ファイルポインタってどうなっているんですか?
Posted: 2012年11月07日(水) 17:46
by Jimmy
コード:
#include <stdio.h>
int main(void)
{
FILE *fp;
if((fp = fopen("test.txt", "r")) == NULL) return 1;
printf("%c, %p\n",fgetc(fp), fp);
printf("%c, %p\n",fgetc(fp), fp);
return 0;
}
「text.txt」の1,2文字目が表示されます。
最初のfgetc(fp)で1文字目、
何もしていないのに、次のfgetc(fp)で2文字が返るのはなぜですか?
よくわからず、アドレスを表示してみましたが、変化がありませんでした。
Re: ファイルポインタってどうなっているんですか?
Posted: 2012年11月07日(水) 18:14
by softya(ソフト屋)
良いポイントに疑問を持ちましたね。
FILE *fpですので、FILEがstdio.hか何処かでtypedefされています。VC++なら検索機能(FILEをクリックして右クリックして宣言へ移動)で探せると思います。
それを見ると構造体だと分かると思いますので、fpは構造体のポインタで構造体を指しているわけです。[誤解を招くので修正]
今現在アクセスしているファイルの情報は構造体かその先(OSの中)にあります。
なので、これ(fp)が変化したら色々問題ありですよね?
どういう風にファイルにアクセスするかの実装はOSやら開発元で異なりますので注意してください。
Re: ファイルポインタってどうなっているんですか?
Posted: 2012年11月08日(木) 12:40
by non
FILE構造体がどうなっているかはよく知りませんが、同じようなmain文で同じような結果を得るためのサンプルプログラムを
作ってみました。なお、fcloseしてなかったので、freeしてません。
コード:
#include <stdio.h>
#include <stdlib.h>
char buff[]="abcdefghijklmnopqrstuvwxyz";
typedef struct {
char *point;
}myFILE;
myFILE *myfopen(void)
{
myFILE *p;
p=(myFILE *)malloc(sizeof(myFILE));
p->point=buff;
return p;
}
int myfgetc(myFILE *p)
{
int ch;
ch=*(p->point);
(p->point)++;
return ch;
}
int main(void)
{
myFILE *fp;
fp=myfopen();
printf("%c, %p\n",myfgetc(fp), fp);
printf("%c, %p\n",myfgetc(fp), fp);
return 0;
}
Re: ファイルポインタってどうなっているんですか?
Posted: 2012年11月08日(木) 20:45
by Jimmy
お二人ともありがとうございます。
ファイルポインタがどういうものか分かりました。
確かにアドレスが変わってしまっては、正常に動作しなくなってしまいますね。
ファイル操作系の関数等を自作してしまう(しかも簡潔に)なんてすごすぎですね。
さすがにハッカーなると桁外れの能力を持っているんですね!
助かりました。
Re: ファイルポインタってどうなっているんですか?
Posted: 2012年11月08日(木) 20:48
by softya(ソフト屋)
Jimmy さんが書きました:お二人ともありがとうございます。
ファイルポインタがどういうものか分かりました。
確かにアドレスが変わってしまっては、正常に動作しなくなってしまいますね。
ファイル操作系の関数等を自作してしまう(しかも簡潔に)なんてすごすぎですね。
さすがにハッカーなると桁外れの能力を持っているんですね!
助かりました。
nonさんのソースコードは、ファイル操作と同じ動きをする文字列バッファからのデータ取り出し処理ですよ。
まぁファイルアクセスが無いだけでfgetc()内部では似たことはしているのですが。
【補足】
使っているアルゴリズムは高度なものではありませんのでnonさんのソースコードをデバッガで追いかけて見ることをおすすめします。