天国にいけるC言語入門 ヘキサ構造体 ver5.2130
fscanf関数を使った後に fprintf関数を使う場合でもfclose関数を使い1度ファイルを閉じ、読み込みモードから書き込みモードに変更する必要があります
👆この操作はゲームでいうとセーブデータを保存した後そのまますぐにそのセーブデータを開いて読み込むときに使用されます。
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
🌻🌻
ははははは
これも成功ね
ソーラーさん
🌻🌻
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます