ユーザーから渡されたデータはまずコンピュータのメモリに保存されるのはコンピュータの基本的なシステムでした

読み取りオープンモード"r"の代わりに追加書き込みオープンモード "a" をつかっても ハードディスク内のファイルに保存したデータをコマンドプロンプト画面に表示することはできません


ソーラー「


オープンモード "r"でファイルを開かなければ 


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


ファイルポインタ変数fpが格納しているアドレスのメモリに


呼び出して格納し


さらに

そのデータを

fscanf関数を使って配列にとりこみ


さらに

配列に取り込まれたデータを


printf関数をつかって


コマンドプロンプト画面に表示できないのかな・・・」


🌻


ははは


どうなってるのかな


🌼



ソーラー「

オープンモード"r"

の代わりに

オープンモード"a"

オープンモード"w"

をつかって


ハードディスク内のファイルに保存したデータを


メモリに読込み


コマンドプロンプト画面に表示できるか


試してみたいな?」




🌻    🌻


そう思う😊? そう思う😊?


なら 試してみようよ


楽しくなってきたね


🌼  🌼


ソーラー


「まずは恒例の


オープンモード"w"をつかって


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;

}


コンパイル結果 


EAZY IDECの場合

Visual Studioの場合


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


ソーラー「よ~し これで準備OK!


まずは


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


数値


1

2

3

4

5


を格納したよ」



🌻


           そう その調子


         

                             🌻


ソーラー「このように


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


数値

1

2

3

4

5


が格納された状態で


まず


オープンモード"a"をつかって


数値

1

2

3

4

5

コマンドプロンプト画面に表示できるか試してみるよ


そのプログラムはつぎのようになるかな。


#pragma warning(disable: 4996)

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


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


ソーラー「

数値データ

1

2

3

4

5

を表示できてないね


ははあ


もともと


オープンモード"a"では


ハードディスク内の

TEN-GOGO-C-language.txtファイルに格納された数値データ


1

2

3

4

5


コンピュータのメモリに格納できなかったんだね


そして


そのかわりにコマンドプロンプト画面に表示された数値


9

2

1703760

1964398416

1703808


これはなんなのかな?」


🌻

     

          ねえ ソーラーさん



                         🌻


ソーラー「はい、なんでしょうか🐭」



🌻

オープンモード"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]);

が実行されても


ハードディスク内のファイルに格納された数値データ


1

2

3

4

5


コンピュータのメモリに集められていないので



今のプログラム内の


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


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


の中の


fscanf関数を使った命令文


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



ファイルポインタ変数fpが格納しているアドレスのメモリから


数値を読み込めない


つまり


機能していないんじゃな~い?


となると


今のプログラムは


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


を取り除いた


以下のプログラムと同じことになるんじゃない?


#pragma warning(disable: 4996)


#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("Hallo!ファイルオープンに成功しましたよ~ん\n");


int hairetu[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]);


fclose(fp);

return 0;

}


ソーラー「あっ そういや そうだよね~


では

👆

今のこのプログラムをコンパイルすると・・・

👇


#pragma warning(disable: 4996)


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


int hairetu[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]);


fclose(fp);

return 0;

}


コンパイル結果


EAZY IDECの場合


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

9

2

1703760

1964398416

1703808


Visual Studioの場合


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

-858993460

-858993460

-858993460

-858993460

-858993460


🌻


         どう? ソーラーさん?



🌻


ソーラー 「


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


を取り除いていないプログラム


取り除いたプログラムの


どちらも

同じコンパイル結果


EAZY IDECの場合


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

9

2

1703760

1964398416

1703808


Visual Studioの場合


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

-858993460

-858993460

-858993460

-858993460

-858993460



がでてきたね


まちがいないね


オープンモード"a"では


ハードディスク内に保存されているデータを


fscanf関数を使ってコンピュータのメモリに


格納することができないんだね。


つまり


fscanf関数が機能していないんだ。


だから


コンパイル後

コマンドプロンプト画面に


9

2

1703760

1964398416

1703808


とへんてこな数値が表示されたのは


fscanf関数が機能しなかったため


int hairetu[5];


と配列宣言され

作製された

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

1

2

3

4

5


データが格納されることはないよね


つまり


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


初期化されていないことになり


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

には

初期化される前に最初から格納されている


モンスター数値

(モンスター数値とは変数や配列が初期化されていないときに変数や配列に最初から格納されている数値のことをいいます)


EAZY IDECの場合

9

2

1703760

1964398416

1703808


Visual Studioの場合

-858993460

-858993460

-858993460

-858993460

-858993460



が格納されているというわけなのさぁ


だから


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


を行うと

EAZY IDECの場合

9

2

1703760

1964398416

1703808


Visual Studioの場合

-858993460

-858993460

-858993460

-858993460

-858993460

表示されたというわけなんだ


    🌻     🌻


      やったね  ソーラーさん



   🌼



ソーラー「この結果を見ても分かるように


オープンモード "r" の代わりに


オープンモード "a" をつかっても


ハードディスク内のファイルに保存したデータを


コマンドプロンプト画面に表示することはできないねえ」




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

作者を応援しよう!

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

応援したユーザー

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