ファイルポインタ変数fpを引数に用いるfgetc関数を考察してポインタ変数の本質を垣間見てみましょう

fgetc関数を使ってハードディスク内のファイルに保存された文字列から1文字だけ文字を読み取ってみましょう

🌻  🌻


fgetc関数を使ってハードディスク内に保存されているファイルの


データを


読み取ってみる?


🌻🌻



ソーラー「

fgetc(エフゲットシー)


なんだかかっこいい名前の関数だね。



🌻🌻

fgetc(エフゲットシー)関数とは


ハードディスク内のファイルに保存された文字列を


1文字ずつ


読み取る関数なんだよ


とりあえず


実際に使っているところを見れば


よくわかると思うな


そのためには


まず


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


何か文字列が保存されてないとね💖



次のプログラムを使って

ハードディスク内のTEN-GOGO-C-languageファイルに文字列データ


Hello!world


を保存してみるよ


🌼      🌼

#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");


fputs("Hello!world\n",fp);


fclose(fp);

return 0;

}


コンパイル結果


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


ソーラー「これで


TEN-GOGO-C-language.txtファイルに


Hello!worldが保存されたわけだね。」



🌻🌻

さあて

さて

fgetc関数を使って

ハードディスク内のファイルに保存された文字列データ


Hello!worldの



       1文字だけを


読み取り


コマンドプロンプト画面に表示してみるよ


🌼🌼


#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");


int c;

c = fgetc(fp);


printf("%c", c);


fclose(fp);

return 0;

}


コンパイル結果

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

H続行するには何かキーをおして下さい・・・_


ソーラー「??


おおっ なんか


Hがprintf出力表示されたね。


ここで


c = fgetc(fp);


は 

fgetc(fp)関数の戻り値を


変数cに格納しているんじゃないかな」



🌻🌻


その通り\(^o^)/


🌼🌼


ソーラー「


c = fgetc(fp);


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


c = fgetc(fp);


が実行されて


ハードディスク内の文字列データHello!worldのHが


コンピュータのメモリに格納されたとき


*fpはそのメモリのアドレスを格納することになります


c = fgetc(fp);



fgetc(fp)は


文字Hを格納しているメモリのアドレスにアクセスし


文字Hに対応する


戻り値を返されることになる


その戻り値は


int c;によって変数宣言されることにより作製された


変数cに格納されることになるんだね。



その戻り値が格納された変数cを


%c出力変換指定子を使ってprintf出力表示すると


コンパイル結果は


H


となっているんだね



🌻🌻


ではね


c = fgetc(fp);を2回つかって


2文字を取り込んでみるよ


c = fgetc(fp);

printf("%c", c);

c = fgetc(fp);

c = fgetc(fp);

printf("%c", c);

printf("%c", c);

に書き換えてみると~


#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");


int c;

c = fgetc(fp);

printf("%c", c);

c = fgetc(fp);

printf("%c", c);

fclose(fp);

return 0;

}


コンパイル結果

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

He続行するには何かキーをおして下さい・・・_



ソーラー「なんだか よくわからないけど


Hello!worldの


2文字He


がコマンドプロンプト画面に表示されたね


どうやら

1回目の

c = fgetc(fp);

printf("%c", c);


が実行されると

H

がコマンドプロンプト画面に表示され


2回目の

c = fgetc(fp);

printf("%c", c);


が実行されると

e

がコマンドプロンプト画面に表示示されるみたいだね。


でもプログラムの仕組みがよく分からないね?


なんで


同じ命令文


c = fgetc(fp);

printf("%c", c);


を行っているのに


コマンドプロンプト画面に表示される文字が


H

e

変化してるのかな?


  🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

     ここにファイルポインタ変数


      いえ 一般に


     ポインタ変数をつかってデータを


      メモリに格納するときの


      根本的で最大の特徴が表れています


 🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓


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


fgetc関数は


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


メモリに格納しています


そのメモリに格納されたデータを


int c;

c = fgetc(fp);


を行い


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


最初に


c = fgetc(fp);


が行われると


文字列Hello!worldの文字Hが


メモリに格納されます


そのとき


*fpには


文字Hを格納しているメモリのアドレスが格納されることになります


次に


c = fgetc(fp);


が行われると


文字列Hello!worldの文字eが


メモリに格納されます。


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


文字Hを格納しているメモリのアドレスが格納されることになります


*fpには


最後に文字を格納したメモリのアドレスが格納されることになります


このとき


文字データHは


文字データe


により上書きされることなく


メモリに保存されたままとなっています。


このように


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


変数名fpのまま


どんどんメモリに


文字データを格納していくことができますが


それらの文字データは互いに上書きされることなく


どんどん別のメモリに格納されていきます。


そのとき


最後に格納されたメモリのアドレスが


*fpに格納されることになります


そして


その最後に


*fpに格納されたメモリのアドレスを


c = fgetc(fp);


は利用していることになります


つまり


*fpに格納されるアドレスは変化しているので


同じ命令文


c = fgetc(fp);

printf("%c", c);


がおこなわれても


コマンドプロンプト画面に表示される文字は変化していくことになります


🌼 🌼


ソーラー「ファイルポインタ変数fpの特徴が


うまくfgetc関数の中で使われているってわけだね」


🌻🌻


ポインタ変数の仕組みはいろんなところで登場してくるね


それでは 次の


プログラムはどうかな?


#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");


int c;

c = fgetc(fp);


printf("%d", c);

printf("%c", c);


fclose(fp);

return 0;

}


コンパイル結果

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

72H続行するには何かキーをおして下さい・・・_


はい


72Hが表示できました


🌼🌼


ソーラー「72H???


この72Hというコンパイル結果と


プログラム内の


int c;

c = fgetc(fp);


printf("%d", c);

printf("%c", c);


の意味が?


よくわからないね。



🌻🌻🌻

そうだね


確かに


ソーラーさんはどう思う?



🌼  🌼



ソーラー「c = fgetc(fp);


は 

fgetc(fp)関数の戻り値を


変数cに格納しているんだよね」



🌻🌻


その通り\(^o^)/その通り\(^o^)/


🌼🌼


ソーラー「そして


その戻り値が格納された変数cを


%d出力変換指定子を使ってprintf出力表示すると


printf("%d", c);


コンパイル結果は


72


%c出力変換指定子を使ってprintf出力表示すると


コンパイル結果は


H


となっている・・・


ははあ、わかった


fgetc(fp);



*fp


に格納されたアドレスのメモリに格納された


ハードディスク内のファイルの文字列データ


Hello!worldのHにアクセスしているんだったよね


そのとき


fgetc(fp)は72という戻り値を返されるんだ


その72は

Hのアスキーコード72となっている


つまり


半角英数字を

fgetc(fp);

を使って読み込むと


その半角英数字のアスキーコードが戻り値として返されるというわけなんだね。


そして その整数値72は


変数宣言int c;


により作成された変数cに格納されたというわけなんだ。


だから

命令文


%d出力変換指定子が用いられた

printf("%d", c);

が実行されると72が表示され



%c出力変換指定子が用いられた

printf("%c", c);

が実行されると


変数cが格納している

72

つまり

アスキーコード72

に対応するHが


コマンドプロンプト画面にコンパイル結果として


表示されるわけなんだね。


%c出力変換指定子は


1から127までのアスキーコードを


それに対応する半角英数字に変換することができるからね」


🌻  🌻


それでは 次の


プログラムはどうかな?

#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");


int c;

c = fgetc(fp);

printf("%c", c);


    c = fgetc(fp);

printf("%c", c);


    c = fgetc(fp);

printf("%c", c);


    c = fgetc(fp);

printf("%c", c);


    c = fgetc(fp);

printf("%c", c);


fclose(fp);

return 0;

}


コンパイル結果

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

Hello続行するには何かキーをおして下さい・・・_


🌼


ソーラー「わかった


つまり


c = fgetc(fp);

を使って


1文字Hを読み込むと


次に


c = fgetc(fp);

を使って

読み込まれる文字は

Hではなく

その隣の文字

e


さらに

c = fgetc(fp);

を使って

読み込まれる文字は

eではなく

その隣の文字

l

に移動しているんだ。



🌻🌻


そう、そして


fgetc関数は半角英数字しか読み取ることができないので


ひらがななどは読み取ることができないんだよ~


だから


ひらがなで構成された文字列ハローワールドを


次のプログラムを使って


TEN-GOGO-C-languageファイルに保存し



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");


fputs("ハローワールド\n",fp);


fclose(fp);

return 0;

}


ハードディスク内のファイルに保存し


ファイルに保存された


文字列データ ハローワールドを


fgetc関数を使って


1文字だけよみこもうとしても



#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");


int c;

c = fgetc(fp);


printf("%c", c);


fclose(fp);

return 0;

}


コンパイル結果

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


が表示されるのみで


何も表示されないのです


🌼  🌼



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

作者を応援しよう!

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

応援したユーザー

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