天国にいけるC言語入門 ヘキサ構造体 ver5.2130
🌞🌞ファイルポインタ変数を使ってハードディスク内のデータをメモリに取り込んでいってもファイルポインタ変数の格納している値は変化しないことを確かめてみよう。
🌞🌞ファイルポインタ変数を使ってハードディスク内のデータをメモリに取り込んでいってもファイルポインタ変数の格納している値は変化しないことを確かめてみよう。
ポインタ変数は
🌞 同じポインタ変数名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のついたメモリに
文字列データが
格納されていることをあらわしているんじゃないかな?」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます