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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Jimmy

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

#1

投稿記事 by Jimmy » 13年前

コード:

#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文字が返るのはなぜですか?
よくわからず、アドレスを表示してみましたが、変化がありませんでした。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 13年前

良いポイントに疑問を持ちましたね。
FILE *fpですので、FILEがstdio.hか何処かでtypedefされています。VC++なら検索機能(FILEをクリックして右クリックして宣言へ移動)で探せると思います。
それを見ると構造体だと分かると思いますので、fpは構造体のポインタで構造体を指しているわけです。[誤解を招くので修正]
今現在アクセスしているファイルの情報は構造体かその先(OSの中)にあります。
なので、これ(fp)が変化したら色々問題ありですよね?

どういう風にファイルにアクセスするかの実装はOSやら開発元で異なりますので注意してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 15年前

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

#3

投稿記事 by non » 13年前

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;
}	 
non

Jimmy

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

#4

投稿記事 by Jimmy » 13年前

お二人ともありがとうございます。

ファイルポインタがどういうものか分かりました。
確かにアドレスが変わってしまっては、正常に動作しなくなってしまいますね。
ファイル操作系の関数等を自作してしまう(しかも簡潔に)なんてすごすぎですね。
さすがにハッカーなると桁外れの能力を持っているんですね!

助かりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 13年前

Jimmy さんが書きました:お二人ともありがとうございます。

ファイルポインタがどういうものか分かりました。
確かにアドレスが変わってしまっては、正常に動作しなくなってしまいますね。
ファイル操作系の関数等を自作してしまう(しかも簡潔に)なんてすごすぎですね。
さすがにハッカーなると桁外れの能力を持っているんですね!

助かりました。
nonさんのソースコードは、ファイル操作と同じ動きをする文字列バッファからのデータ取り出し処理ですよ。
まぁファイルアクセスが無いだけでfgetc()内部では似たことはしているのですが。

【補足】
使っているアルゴリズムは高度なものではありませんのでnonさんのソースコードをデバッガで追いかけて見ることをおすすめします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る