fprintf関数を使った後に fscanf関数を使うと ファイル内のデータはコンパイル結果に正しく表示されません。
ソーラー 「オープンモード"w+"は
なんか 微妙な考察結果となったね
🌞ははは🌞
🌞ははは🌞
オープンモード"r+"について
もう1度
調べてみよっみよっ
ソーラー「オープンモード"r+" お気に入りなんだね
安定感あるしね
よ~し
それではっっ
もう1度
オープンモード"r+"について考察してみよう
オープンモード"r+"は読み取り機能をもっているので
まず
データを読み取る機能を調べるために
TEN-GOGO-C-language.txtファイルに
なにがしかのデータを保存する必要があるかな」
それでは😊
またまた恒例の
オープンモード"w"をつかって
TEN-GOGO-C-language.txtファイルに
数値
1
2
3
4
5
を
保存します
そのプログラムは次の通り
#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
を格納できたよ」
🌻
それでは
このTEN-GOGO-C-language.txtに格納した数値
1
2
3
4
5
を
オープンモード"r+"をつかって
コンピュータのメモリによみこみ
コマンドプロンプト画面に表示してみます
#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);
return 0;
}
コンパイル結果
Hello!ファイルオープンに成功しましたよ~ん
1
2
3
4
5
ソーラー「
うまく 数値を
コマンドプロンプト画面に表示できたね
読み取り機能は普通に機能してるね
今度は書き込み機能を試してみよう
#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("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);
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
ソーラー「ははあ
先程のオープンモード"w+"のときと同じ
コンパイル結果となるっと・・・
整数値
2
3
4
5
6
を
TEN-GOGO-C-language.txtファイルに
格納したけれど
コンパイル結果は
Hello!ファイルオープンに成功しましたよ~ん
9
2
1703760
1964398416
1703808
か・・・
もしかして
fprintf関数を使った後に
fscanf関数を使うと
必ず
コマンドプロンプト画面には
コンパイル結果が
Hello!ファイルオープンに成功しましたよ~ん
9
2
1703760
1964398416
1703808
がprintf出力表示されるのかな
🌻 🌻 🌻
あっ ほんとだ そうかもしれない💖
このとき
PC内で
TEN-GOGO-C-language.txtファイル
を検索してみると
ファイルの中身は
ちゃんと
2
3
4
5
6
が保存されています
ソーラー「
fprintf関数を使った後に
fscanf関数を使うと
コンパイル結果
Hello!ファイルオープンに成功しましたよ~ん
9
2
1703760
1964398416
1703808
となるなら
逆に順番を入れ替えて
fscanf関数を使った後に
fprintf関数を使うと
コンパイル結果はどうなるのかな
🌻そうくるの💦💦
ソーラー「
fscanf関数を使った後に
fprintf関数を使う
プログラムを構成してみるよ
プログラムは以下のようになります
#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]);
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);
fclose(fp);
return 0;
}
ソーラー「このプログラムが実行される前は
TEN-GOGO-C-language.txtファイルには
2
3
4
5
6
が保存されていた
だから
このプログラムでは
fscanf関数によりファイル内の数値データ
2
3
4
5
6
はよみこまれ
コンパイル結果は
Hello!ファイルオープンに成功しましたよ~ん
2
3
4
5
6
が表示されるはず・・・
実際にコンパイルしてみると・・・
コンパイル結果は
Hello!ファイルオープンに成功しましたよ~ん
2
3
4
5
6
ソーラー「
成功してる
問題があるのは
fprintf関数を使った後に
fscanf関数を使うときか・・・
(実はこのとき問題が発生しています
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);
は機能していないので
新たに
TEN-GOGO-C-language.txtファイルに
2
3
4
5
6
は保存されていません
ですが
もともと
TEN-GOGO-C-language.txtファイルには
2
3
4
5
6
が保存されていたので
そのことに気づいていないのです)
オープンモード"w+"
オープンモード"r+"
で
fprintf関数を使った後に
fscanf関数を使うと
コンパイル結果
Hello!ファイルオープンに成功しましたよ~ん
9
2
1703760
1964398416
1703808
となったけど
残りの
オープンモード"a+"
ではどうかな?
オープンモード"a+"で
fprintf関数を使った後に
fscanf関数を使うプログラム
👇をコンパイルすると
#include <stdio.h>
int main (void){
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","a+");
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
else printf("Hello!ファイルオープンに成功しましたよ~ん\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);
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
🌻
やっ やったね
オープンモード"w+"
オープンモード"r+"
のときと同じ結果になったね(^_-)-☆
🌼
ソーラー「つまり
fprintf関数を使った後に
fscanf関数を使うと
コンパイル結果は ファイル内のデータを正しく表示されないんだ
意外な収穫だったね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます