👆この操作はゲームでいうとセーブデータを保存した後そのまますぐにそのセーブデータを開いて読み込むときに使用されます。

fscanf関数を使った後に fprintf関数を使う場合でもfclose関数を使い1度ファイルを閉じ、読み込みモードから書き込みモードに変更する必要があります

ソーラー「先程のプログラムでは

     👇


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


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


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


/*ここでハードディスク内のファイルのデータを


書き込み、読み取り両方できる


オープンモード"a+"でファイルを開きました。この時点ではまだ、書き込みモードになるか、読み込みモードになるかは決定されていません*/




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


/*fscanf関数を使用することによりTEN-GOGO-C-language.txtファイルは

読み取りモードで開かれることになります

ですので

読み込みモードで使えるfprintf関数は機能しなくなります*/


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

1

2

3

4

5



ソーラー「👆


fprintf関数を使った後

ファイルを閉じ

fscanf関数を使用しました。


このプログラムは

まず

オープンモード"a+"でファイルを開いた後

最初に

fprintf関数を使ったので

ファイルは書き込みモードで開かれることが確定したわけです。


ですから


読み込みモードで使えるfscanf関数を使用するためには


fclose(fp);


を行ってファイルを閉じ


ファイルが書き込みモードでオープンされた状態を


終える必要がありました。


その後


再びオープンモード"a+"でファイルを開いた後


最初に

fscanf関数を使ったので


ファイルは読み込みモードで開かれることが確定したわけです。


そして


fscanf関数を使って


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


用意した配列に格納し


配列の中に保存された数値を


printf出力表示できたというわけです。


では

fprintf関数をつかってから

fscanf関数を使うのではなく


fscanf関数をつかってから

fprintf関数を使う場合はどうしたらよいのでしょうか?


具体的には

今のプログラムの

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


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


の順序をいれかえることになります。


つまり


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


のあとに


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


の命令文を実行することになります。


この場合は


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


以前に保存されていた数値を


fscanf関数を使って


配列に格納して


配列の中に格納された数値を


printf出力表示した後に



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

の命令文を実行し


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


fprintf関数を使って


数値

1

2

3

4

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


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


を行って


ファイルを閉じ


読み込みモードを終える

必要があるのかな?」




🌻それは簡単!


読み込みモードで

fscanf関数を使って


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


数値を配列に読み込み


配列に格納された数値をprintf出力表示したあとに


fprintf関数を使いたいなら


ファイルオープン状態を


読み込みモードから

書き込みモードに

変更する必要があるから



fclose(fp);//ファイルを閉じます

FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","a+");//再びファイルオープンしています


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

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

if(fp==NULL){

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

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


を行ってファイルを閉じて読み込みモードを終了し


再びファイルを開いて


書き込みモードに変更する必要があるっていうことになるんじゃない?


🌻  🌻



ソーラー「それもそうだね


それでは


fscanf関数を使った後に

fclose(fp);

をおこない

fprintf関数を使う

プログラムを構成してみるよ


まずは恒例の


次のプログラムを実行して


ハードディスク内の

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


数値

1

2

3

4

5

を保存してみます


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

return 0;

}


コンパイル結果


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


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


数値

1

2

3

4

5

が保存されているね


数値


1

2

3

4

5

をTEN-GOGO-C-language.txtファイルに保存できたところで


fscanf関数を使った後に

fclose(fp);

をおこない


再びファイルを開き

fprintf関数を使う

プログラムを構成してみるよ


プログラムは以下のようになります」


#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 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);/*ファイルを閉じます*/


FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","r+");/*再びファイルを開きます*/


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

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


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

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

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

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

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


fclose(fp);

return 0;

}


ソーラー「fscanf関数をつかって


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


数値データ

1

2

3

4

5

配列に格納し


配列に格納された数値をprintf出力表示した後


fprintf関数をつかって


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


数値データ

6

7

8

9

10



保存したので


コンパイル結果は


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

1

2

3

4

5

が表示されるはずなんだ😊


🌻🌻 


どうなる💖 どうなる💖


🌻


ソーラー


「もう1回繰り返すよ~


このプログラムがコンパイルされると


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


1

2

3

4

5

が保存されていたので


fscanf関数により


その数値データ


1

2

3

4

5


配列宣言

int hairetu[5];

によって生成された

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

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

により


コンパイル結果は


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

1

2

3

4

5

が表示されるはずなんだ😊


それではっ


コンパイルっ」


🌻


さあ


コンパイル結果は・・・

🌻







コンパイル結果


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

1

2

3

4

5



ソーラー「やったね😊


成功してる~~~


そして


fclose(fp);

により

ファイルが閉じられた後


FILE *fp;

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


により


       新規書き込み機能を持つ


つまり  以前ファイルに保存されていたデータが消去される


オープンモード"r+"

でファイルを開いたので


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

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

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

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

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


が実行されると


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


数値

1

2

3

4

5

は消去され


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


代わりに


6

7

8

9

10


が保存されるているはず💖


そこで


PC内検索でTEN-GOGO-C-language.txtファイルを探し出し


中身を調べてみると・・・


TEN-GOGO-C-language.txtファイルの中身は・・・


6

7

8

9

10


🌻🌻

ははははは


これも成功ね


ソーラーさん


🌻🌻


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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