🌞🌞ファイルポインタ変数を使ってハードディスク内のデータをメモリに取り込んでいってもファイルポインタ変数の格納している値は変化しないことを確かめてみよう。

ポインタ変数は



      🌞 同じポインタ変数名hairetuをつかって     🌞

      🌞 どんどん文字列データを別々のメモリに格納でき 🌞

      🌞 1番最後にメモリに格納された文字列データを 🌞 

      🌞 格納しているメモリのアドレスが      🌞

      🌞 ポインタ変数であるhairetuに格納される。  🌞


という仕組みがあったけれど


ファイルポインタ変数は


それをさらにパワーアップしたものになっています


その仕組みとは


       同じファイルポインタ変数名fpをつかって

    どんどんデータを別々のメモリに格納できるのですが 

  ファイルポインタ変数fpに格納されている値は変化しません


つまり


ファイルポインタ変数fpに格納されている値すなわちアドレスは


ずっと変化しないのです



別の言い方をすれば


ファイルポインタ変数fpはずっと1つの同じメモリのアドレスを


保持し続けます


それなのに


どんどんデータを別々のメモリに格納できるのです


ファイルポインタ変数fpはすごいですね


ただし


ファイルポインタ変数fpに格納されているアドレスは


ずっと変化しないんですが・・・


ファイルポインタ変数fpに格納されているアドレス先の


メモリに格納されているデータは


新しいデータがメモリに保存されるごとに


変化していきます


ポインタ変数の特徴として


ファイルポインタ変数fpに格納されているアドレスのメモリに


格納されているデータは


fpに*をつけた


*fpであらわされるので


ハードディスクのファイルに保存されているデータが


新しくメモリに保存されるごとに


*fpの値は変化していきます


その様子を


        ちょっとだけ


垣間見てみましょう。


まずは


次のプログラムを用いて


ハードディスクのTEN-GOGO-C-language.txtファイルに


1

2

3

4

5

を

保存してみよう。」




#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","w");

if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


fprintf(fp,"%d\n",1);

fprintf(fp,"%d\n",2);

fprintf(fp,"%d\n",3);

fprintf(fp,"%d\n",4);

fprintf(fp,"%d\n",5);


fclose(fp);

return 0;

}


コンパイル結果(EAZY IDECの場合)

ビルド結果(Visual Studioの場合)


Hello!ファイルオープンに成功しましたよ~ん


ソーラー「これで


ハードディスクのTEN-GOGO-C-language.txtファイルに


1

2

3

4

5

は

保存されたわけだ。」


この

ハードディスクのTEN-GOGO-C-language.txtファイルに

保存された

1

2

3

4

5

を


メモリに格納する際


ファイルポインタ変数fpに格納されている値は


変化しないことを確かめてみようよ


ついでに


*fpがどのような値をもつかを


しらべてみよ~う」



🌻そうだね😊そうしよ🌻



ソーラー「そのプログラムは


次のようになるね。


いたるところに


fpや*fpがどのような値をもつかをしらべるために


printf("%p\n", *fp);

printf("%p\n", fp);

が記述されているよ。」




#pragma warning(disable: 4996)

#include <stdio.h>


int main(void) {


FILE *fp;

fp = fopen("TEN-GOGO-C-language.txt", "r");


if (fp == NULL) {

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;

}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


printf("%p\n", fp);


int hairetu[5];


fscanf(fp, "%d", &hairetu[0]);

printf("%p\n", *fp);

printf("%p\n", fp);


fscanf(fp, "%d", &hairetu[1]);

printf("%p\n", *fp);

printf("%p\n", fp);


fscanf(fp, "%d", &hairetu[2]);

printf("%p\n", *fp);

printf("%p\n", fp);


fscanf(fp, "%d", &hairetu[3]);

printf("%p\n", *fp);

printf("%p\n", fp);


fscanf(fp, "%d", &hairetu[4]);

printf("%p\n", *fp);

printf("%p\n", fp);


printf("%d\n", hairetu[0]);

printf("%d\n", hairetu[1]);

printf("%d\n", hairetu[2]);

printf("%d\n", hairetu[3]);

printf("%d\n", hairetu[4]);


fclose(fp);


return 0;

}


コンパイル結果


Hello!ファイルオープンに成功しましたよ~ん

032F4848

032FB009

032F4848

032FB00B

032F4848

032FB00D

032F4848

032FB00F

032F4848

032FB011

032F4848

1

2

3

4

5


🌻  🌻


ファイルポインタ変数宣言とfopen関数の設定

👇

FILE *fp;

fp = fopen("TEN-GOGO-C-language.txt", "r");


if (fp == NULL) {

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;

}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


が実行された後


printf("%p\n", fp);


によって


ファイルポインタ変数fpが格納しているアドレス


032F4848


が表示されているね。


つまり


fp == NULL


でないので


ファイルオープンに成功したんだね



🌼  🌼



ソーラー「ファイルオープンに成功すると



fp = fopen("TEN-GOGO-C-language.txt", "r");


の fopen("TEN-GOGO-C-language.txt", "r");


はNULLを戻り値に持たず


fpにNULLは代入されないんだね」




🌻  🌻


次 行ってみようかな😊


次に


fscanf(fp, "%d", &hairetu[0]);

printf("%p\n", *fp);

printf("%p\n", fp);



が実行されると


ハードディスクのTEN-GOGO-C-language.txtファイルに保存された


文字列データ"1"


は


ファイルポインタ変数fpを使って


メモリに


文字列データ"1"のまま


格納されます


そして


文字列データ"1"から数値データ1が取り出され


配列変数hairetu[0]には数値データ1が格納されます


このとき

printf("%p\n", fp);


の実行結果が


032F4848


のまま変化していないのがわかります


つまりハードディスクのTEN-GOGO-C-language.txtファイルから


メモリに文字列データ"1"を格納したとしても


ファイルポインタ変数に格納されているアドレスは


032F4848


のまま変化していないのがわかります


このときの


printf("%p\n", *fp);


の実行結果が


00BBB009


となっています


ポインタ変数ptaに変数aのアドレスを与えられたとき


*ptaが変数aに格納されたデータを表すように


*fpは


ファイルポインタ変数fpの格納しているアドレスのメモリに


格納されたデータをあらわしています


次に


fscanf(fp, "%d", &hairetu[1]);

printf("%p\n", *fp);

printf("%p\n", fp);


が実行されると


ハードディスクのTEN-GOGO-C-language.txtファイルに保存された


文字列データ"2"


は


ファイルポインタ変数fpを使って


メモリに


文字列データ"2"のまま


格納されます


そして


文字列データ"2"から数値データ2が取り出され


配列変数hairetu[1]には数値データ2が格納されます


このとき


printf("%p\n", fp);


の実行結果が


032F4848


のまま変化していないのがわかります


つまりハードディスクのTEN-GOGO-C-language.txtファイルから


メモリに文字列データ"1"を格納したときも


メモリに文字列データ"2"を格納したときも


ファイルポインタ変数に格納されているアドレスは


032F4848


のまま変化していないのがわかります


このときの


printf("%p\n", *fp);


の実行結果が


032FB00B


となっています


つまり


ファイルポインタ変数fpが格納している


アドレス番号032F4848の付いたメモリに格納されている値は


032FB009から032FB00Bに変化しています


🌼  🌼


ソーラー「この


ファイルポインタ変数fpが格納している


アドレス番号032F4848の付いたメモリに格納されている値


032FB009

032FB00B


って何をいみしているのかがわからないな?


何だろう」



🌻  🌻


次に


fscanf(fp, "%d", &hairetu[2]);

printf("%p\n", *fp);

printf("%p\n", fp);


が実行されると


ハードディスクのTEN-GOGO-C-language.txtファイルに保存された


文字列データ"3"


は


ファイルポインタ変数fpを使って


メモリに


文字列データ"3"のまま


格納されます


そして


文字列データ"3"から数値データ3が取り出され


配列変数hairetu[2]には数値データ3が格納されます


このとき


printf("%p\n", fp);


の実行結果が


032F4848


のまま変化していないのがわかります


つまりハードディスクのTEN-GOGO-C-language.txtファイルから


メモリに文字列データ"1"を格納したときも


メモリに文字列データ"2"を格納したときも


メモリに文字列データ"3"を格納したときも



ファイルポインタ変数に格納されているアドレスは


032F4848


のまま変化していないのがわかります


このときの


printf("%p\n", *fp);


の実行結果が


032FB00D


となっています


つまり


ファイルポインタ変数fpが格納している


アドレス番号032F4848の付いたメモリに格納されている値は


032FB00Bから032FB00Dに変化しています



次に


fscanf(fp, "%d", &hairetu[3]);

printf("%p\n", *fp);

printf("%p\n", fp);


が実行されると


ハードディスクのTEN-GOGO-C-language.txtファイルに保存された


文字列データ"4"


は


ファイルポインタ変数fpを使って


メモリに


文字列データ"4"のまま


格納されます


そして


文字列データ"4"から数値データ4が取り出され


配列変数hairetu[3]には数値データ4が格納されます


このとき


printf("%p\n", fp);


の実行結果が


032F4848


のまま変化していないのがわかります


つまりハードディスクのTEN-GOGO-C-language.txtファイルから


メモリに文字列データ"1"を格納したときも


メモリに文字列データ"2"を格納したときも


メモリに文字列データ"3"を格納したときも


メモリに文字列データ"4"を格納したときも



ファイルポインタ変数に格納されているアドレスは


032F4848


のまま変化していないのがわかります



このときの


printf("%p\n", *fp);


の実行結果が


032FB00F


となっています


つまり


ファイルポインタ変数fpが格納している


アドレス番号032F4848の付いたメモリに格納されている値は


032FB00Dから032FB00Fに変化しています



次に


fscanf(fp, "%d", &hairetu[3]);

printf("%p\n", *fp);

printf("%p\n", fp);


が実行されると


ハードディスクのTEN-GOGO-C-language.txtファイルに保存された


文字列データ"5"


は


ファイルポインタ変数fpを使って


メモリに


文字列データ"5"のまま


格納されます


そして


文字列データ"5"から数値データ5が取り出され


配列変数hairetu[4]には数値データ5が格納されます


このとき


printf("%p\n", fp);


の実行結果が


032F4848


のまま変化していないのがわかります


つまりハードディスクのTEN-GOGO-C-language.txtファイルから


メモリに文字列データ"1"を格納したときも


メモリに文字列データ"2"を格納したときも


メモリに文字列データ"3"を格納したときも


メモリに文字列データ"4"を格納したときも


メモリに文字列データ"5"を格納したときも


ファイルポインタ変数に格納されているアドレスは


032F4848


のまま変化していないのがわかります



このときの


printf("%p\n", *fp);


の実行結果が


032FB011


となっています


つまり


ファイルポインタ変数fpが格納している


アドレス番号032F4848の付いたメモリに格納されている値は


032FB00Fから032FB011に変化しています



🌼 🌼




ソーラー「確かに


ハードディスクのTEN-GOGO-C-language.txtファイルから


メモリに文字列データ"1"を格納したときも


メモリに文字列データ"2"を格納したときも


メモリに文字列データ"3"を格納したときも


メモリに文字列データ"4"を格納したときも


メモリに文字列データ"5"を格納したときも


ファイルポインタ変数に格納されているアドレスは


032F4848


のまま変化していないんだね。


このことは


おそらく


ファイルポインタ変数fpに格納されている


アドレス番号032F4848のついたメモリに


文字列データが


格納されていることをあらわしているんじゃないかな?」



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます