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関数を使うと


コンパイル結果は ファイル内のデータを正しく表示されないんだ


意外な収穫だったね。」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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