ページ 11

ファイルポインタってどうなっているんですか?

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さんのソースコードをデバッガで追いかけて見ることをおすすめします。