ハードディスク内のファイルとデータをやり取りするメモリのアドレスが ファイルポインタ変数fpに格納されます  そのメモリのアドレスは変化しません

ハードディスク内のファイルとデータをやり取りするメモリのアドレスが ファイルポインタ変数fpに格納されます

ソーラー「ちょっと以前のエピソードで


ポインタ変数を使って


たくさんの文字列データを


メモリに格納することができたね


そのプログラムは次のようになっていたね。


#include <stdio.h>


int main(void){


char* hairetu="neko";

hairetu="nyao";

hairetu="myao";

hairetu="syao";

hairetu="cyao";

printf("%s\n",hairetu);


return 0;

}


コンパイル結果

cyao


🌻これはなに? どうなってるの?🌻


(Visual Studio2019以降のバージョンではポインタ変数を使って文字列データをメモリに格納する機能は削除されています このエピソードは今となっては懐かしい頃のお話となっています)



ソーラー「ふふ


これはね


ポインタ変数の凄さをあらわしているプログラムなんだ。」


🌻ポインタ変数の凄さ?


なに? なに?


🌻


このプログラムでは


同じポインタ変数名hairetuをつかってはいるけど


文字列データ

"neko"

"nyao"

"myao"

"syao"

"cyao"

すべて

上書きなどして消去されることなく

メモリ内に保存されいくんだ


つまり


      同じポインタ変数名hairetuを


       つかっているにもかかわらず


どんどん


文字列データ

"neko"

"nyao"

"myao"

"syao"

"cyao"


別べつのメモリに


格納されていくんだよ」


🌻そ、そうなの🌼


ソーラー「


このとき


1番最後にメモリに格納された🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



文字列データ"cyao"を格納しているメモリのアドレス🍓🍓🍓🍓🍓🍓🍓


ポインタ変数hairetu🍓🍓🍓🍓🍓🍓🍓


に格納されてるんだよ」


🌻ほおお🌼


ソーラー「


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

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

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

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

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



ここがポインタ変数を使ってメモリにデータをとりこむときの


根本にして最大の特徴なんだね。(だったのです (*^▽^*)(笑))


では


FILE *fp;

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


が実行されたときのファイルポインタ変数はどのような働きをするのでしょうか?



ハードディスクにデータを保存するとき


保存したいデータは


🍓🍓🍓まずファイル構造体を通してメモリに格納されてから🍓🍓🍓


ハードディスクにデータが保存されるという流れになっています


ハードディスクに保存されたデータを読み取って


コマンドプロンプト画面に表示するときは


ハードディスクに保存されたデータは


🍓🍓🍓まずファイル構造体を通してメモリに格納されます🍓🍓🍓


そうしてメモリに格納されたデータをprintf関数などを使って


コマンドプロンプト画面に表示しています。


ハードディスクにデータを保存するときも


ハードディスクに保存されたデータを読み取るときも


ファイル構造体を通してメモリに


データは格納されていきます


そのメモリのアドレスを格納しているポインタ変数が


ファイルポインタ変数なのです


FILE *fp;

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


の実行において


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


が実行されると


fopen("TEN-GOGO-C-language.txt","w")に


戻り値として


TEN-GOGO-C-language.txtファイルとデータをやり取りするメモリのアドレスが格納されます


ですので

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


が実行されると


TEN-GOGO-C-language.txtファイルとデータをやり取りするメモリのアドレスが

ファイルポインタ変数fpに格納されます



ポインタ変数は



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

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

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

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

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


のような特徴をもっていますが


FILE *fp;

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


により生成されるファイルポインタ変数fpは


そのような働きをするために生成されるのではありません



ファイルポインタ変数fpは 単純に


TEN-GOGO-C-language.txtファイルとデータをやり取りするメモリのアドレスを格納しているだけなのです


そして


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


ずっと変化しません


つまり


TEN-GOGO-C-language.txtファイルとデータをやり取りするメモリ

変化しないというわけです



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


保持し続けているのです


データをTEN-GOGO-C-language.txtファイルのデータをメモリに読み込むときは


そのメモリのアドレスにTEN-GOGO-C-language.txtファイルのデータは格納されることになります


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


TEN-GOGO-C-language.txtファイルのデータは


メモリに新たなデータが格納されるごとに


新しいデータに上書きされていきます




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


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


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


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


TEN-GOGO-C-language.txtファイルから新しいデータがメモリに保存されるごとに


新しいデータにどんどん変化していきます


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


*fpであらわされるので


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


*fpの値は変化していくことになります


🌻  🌻


なんで すごい


そんなことしってたんだ


🌼  🌼


ソーラー「


というわけで


FILE *fp;

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


が実行されると


戻り値として


TEN-GOGO-C-language.txtファイルとデータをやり取りするメモリのアドレスが


ファイルポインタ変数fpに格納されるのです


ファイルポインタ変数fpを用いて


メモリにデータを格納しているわけではありません」





🌻  🌻


ファイルポインタ変数fpは


ずっと同じアドレスを格納し続けている・・


ということは たとえば


ハードディスク内のデータをファイル構造体を通してメモリに


読込むとき


そのアドレスのメモリに向けて


ハードディスク内のデータが集められるということかな?


そしてデータが格納されるごとに


fp*


つまり


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


格納されているデータが上書きされていくということかな?


🌼



ソーラー「そのとおりなんです」



🌻   🌻


な、なぜ そのことを・・・


🌼   🌼



ソーラー「ふふっ さあ、僕にもよくわかりません😊」




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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る