ファイルを閉じて書き込みモードを解除せずに新たにファイルポインタ変数宣言を行って読み込みモードでファイルを開いても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をお使いの方は、

2度目のファイルポインタ変数宣言

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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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