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