fprintf関数を使った後に fscanf関数を使ってみる

ソーラー「


先のプログラムでは


fprintf関数をつかってファイルに

1

2

3

4

5

を格納した後に


fscanf関数をつかっていたので


fscanf関数は


1

2

3

4

5


をメモリに取り込むのか?


それとも


オープンモード”w+”で


空白となったファイルのデータを


をメモリに取り込むのか?


つまり


メモリに取り込めないのか?


それとも


このプログラムが実行される以前に


ファイルに格納されていた空白のデータを


メモリに取り込むのか?


つまり


メモリに取り込めないのか?


が わかりにくかったかな?



🌻  🌻


🌞


それは・・・


そうだね



🌼  🌼


ソーラー 「

前のエピソードのプログラム

👇

はこんなだったかな?


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


int hairetu[5];


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

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

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

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

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

/*fscanf関数は直前の

fprintf関数によってファイルに格納される

数値

1

2

3

4

5

読み込むのか


オープンモード”w+”をつかうことにより

空白となったファイルデータ

読み込むのか


このプログラムが実行される以前に

ファイルに格納されていた空白のデータを

読み込むのか?


わかりにくいよね*/



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!ファイルオープンに成功しましたよ~ん

9

2

1703760

1964398416

1703808



ソーラー

そこで


fscanf関数が何を読み込もうとしているかを


もうすこし明確にしてみたいとおもうんだ」



🌻なるほどっ



ソーラー「

そこで まず プログラム


#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("Hallo!ファイルオープンに成功しましたよ~ん\n");


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

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

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

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

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


return 0;

}


コンパイル結果

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



をつかって


数値

2

3

4

5

6

TEN-GOGO-C-language.txtファイルに書き込む。


PC内検索で


TEN-GOGO-C-language.txtファイルを探して


中身を確認してみると

数値

2

3

4

5

6

が 格納されているのがわかるよね。


後は


この

数値

2

3

4

5

6


オープンモード"w+"の読み込み機能を使って


コマンドプロンプト画面に読み込んでいこうというわけなんだ


つまり

同じプログラム内で

fprintf関数とfscanf関数を同時につかわないように


最初からfprintf関数をつかって


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


数値

2

3

4

5

6

を格納したってわけなんだよ」




🌻なるほど


冴えてる~~

🌼


ソーラー「このTEN-GOGO-C-language.txtファイルに


保存された


2

3

4

5

6


オープンモード”w+”の読み込み機能を使って


コマンドプロンプト画面に読み込むプログラムは


次のようになります


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


int hairetu[5];


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

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

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

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

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


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!ファイルオープンに成功しましたよ~ん

9

2

1703760

1964398416

1703808


🌻この結果をみると


fscanf関数は


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


格納されていたデータ


2

3

4

5

6

を読み込めていない・・・


となると


やっぱり


オープンモード”w+”の読み込み機能は


働いていないってことになるね。


オープンモード"w+"でファイルを開いた時点で


ファイルに保存されているデータは何もなくなる


そうなると


fscanf関数は何もデータをメモリに格納することができず


そうなると


配列宣言

int hairetu[5];


によって生成される


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


は何も値が代入されることはなくなるので


初期化されず


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

が初期化されないときに


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


に格納されている



9

2

1703760

1964398416

1703808



コンパイル結果に表示されるんだね



🌻  🌻



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

作者を応援しよう!

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

応援したユーザー

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