ファイルを閉じて書き込みモードを解除せずに新たに別のファイルポインタ変数宣言を行って読み込みモードでファイルを開いてもfscanf関数を使ってファイルデータを読み込むことはできません。


ソーラー「


同じプログラム内で fprintf関数を使って保存された数値を fscanf関数を使って配列に取り込むにはデータを保存後1度ファイルを閉じて書き込みモードを解除する必要があります。


面白い仕組みになってるね🌞」


🌻

🌞そうだね🌞

🌼


ソーラー「1度、ファイルを閉じて書き込みモードを解除してから


再び


読み込みモードでfopen関数の設定をおこない


ファイルを開くんだよね。


先程の例では


fclose(fp);


を行った後


fopen関数の設定


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


を行い


読み込み機能と書き込み機能をもつオープンモード"a+"でファイルを


開いたよね。


そうすることにより


ハードデイスク内に保存されたファイルデータを


fscanf関数を使って読み取ることができるようになるわけなんだね。



そのプログラムは

次のように記述されたかな



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

/*TEN-GOGO-C-language.txtが書き込みのみできる状態を解除しました*/


FILE *fp;



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

if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}


/*TEN-GOGO-C-language.txtファイルを閉じたので

そのままでは

TEN-GOGO-C-language.txtファイルに格納された数値データを


よみとることができないので


再び

ファイルポインタ変数宣言とオープンモード"a+"の設定を行いました。


Visual Studioをお使いの方は、

ファイルポインタ変数宣言

FILE *fp;

は記述しないでください

ビルドエラーになります

*/



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

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

1

2

3

4

5


ソーラー「

👆

このプログラムのように


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


が実行されて


ファイルに数値データ

1

2

3

4

5

が格納された後


fclose(fp);


を行い


書き込みモードを解除しないといけないというわけなんだね。


fclose(fp);


を行うと


書き込みモードを解除できるけど


このままではファイルが閉じられたままで


読み込みができないから


ふたたび

ファイルポインタ変数宣言とfopen関数の設定


FILE *fp;

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


(Visual Studioをお使いの方は、FILE *fp;を記述しないでください

ビルドエラーになります

)


if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}


を行う必要があるんだね。

そして

今は 

読み込みも書き込みもできる


オープンモード"a+"でファイルが開かれたわけだけど


オープンモード"a+"が

読み込みモードになるか書き込みモードになるかは


最初に

読み込みできるfscanf関数を使うか

書き込みできるfprintf関数を使うかによって決まるので


オープンモード"a+"でファイルが開かれた後すぐに

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

の命令文が実行されると


オープンモード"a+"は

読み込みモードになります。


そして


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

により

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


fprintf関数によってたった今

TEN-GOGO-C-language.txtファイルに保存された

数値

1

2

3

4

5


が格納できるようになり



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

が実行されると


コマンドプロンプト画面に


1

2

3

4

5

が表示される。


ということになるんだね。



さあて\(^o^)/



ここで


fclose(fp);


を行って


書き込みモードを解除しなかったら


どうなるかな


ねえ どう思うかな?


🌻

それは つまり


fclose(fp);


を行なって


書き込みモードを解除しなくても


新たに


ファイルポインタ変数宣言とfopen関数の設定


FILE *fp;

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


さえ行ってしまえば


fscanf関数を使って


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


のデータを読み込むことができるんじゃない?


ということかな」


ソーラー「ビンゴ その通りだね。


分かってもらって嬉しくなっちゃうな。」


🌻

はは🌞🌞🌞


どういたしまして


あなたとお話しできて


私も嬉しいかな


🌼


ソーラー「では


先程の

プログラムで


fclose(fp);


を行なって


書き込みモードを解除しなくても


新たに


ファイルポインタ変数宣言とfopen関数の設定


FILE *fp;

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


さえ行ってしまえば


fscanf関数を使って


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


のデータを読み込むことができるかどうか


試してみよう。


さあ


先程のプログラムで


fclose(fp);


をとりのぞいても


同じコンパイル結果が得られるかな?


#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);を削除しました☆☆*/


FILE *fp;


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

if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}


/*TEN-GOGO-C-language.txtファイルを閉じたので

そのままでは

TEN-GOGO-C-language.txtファイルに格納された数値データを


よみとることができない?


とおもい


再び

ファイルポインタ変数宣言とオープンモードの設定を行いました。


(Visual Studioをお使いの方は、

ファイルポインタ変数宣言

FILE *fp;

は記述しないでください

ビルドエラーになります)

*/



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;

}


コンパイル結果


EAZY IDECの場合


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

9

2

1703760

1964398416

1703808


Visual Studioの場合


-858993460

-858993460

-858993460

-858993460

-858993460

(この値はコンピュータのメモリの使用状況によって異なってきます。)


ソーラー「あっ


やっぱり


fclose(fp);


を行って書き込みモードを解除しなければ


fscanf関数を使って


ハードデイスク内の


TEN-GOGO-C-language.txtファイルに格納された数値データを


読み取ることができないみたいだね。」


🌻🌻


面白いね


🌼🌼



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

作者を応援しよう!

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

応援したユーザー

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