ハードディスク内のファイルにデータを保存する場合もハードディスク内のファイルを利用する場合も、そのシステムは機能しています

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

ソーラー「

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


ハードディスク内のファイルに新規書き込みできるけど


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


fscanf関数をつかって


用意した配列に読み込みできない


そのことを実際にためしてみよっかな(*´▽`*)


つまり


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


ハードディスク内のファイルを開き


fscanf関数をつかって


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


メモリに格納した後


そのメモリに格納されたデータを


用意した配列の配列変数に読み込み


printf関数を使って


配列変数に格納された数値データを


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


試してみればいいわけだね」





🌼    🌼    🌼


さあ、ソーラーさん 今度はどうなるかな?


🌻    🌻    🌻


ソーラー


「実はオープンモード"w"をつかってハードディスク内の


ファイルを開くとファイルが初期化されて


以前にファイルに保存されていたデータは消え


ファイルに何もデータが入ってない状態になるんだよね~


だから


結局


データをよみこむことはできないんだなぁ


これが


でも


コンパイルしたらどのような結果がでるかは


わからないね


🌻  🌼  🌻  🌼  🌻


そう・・・そう・・・


試しちゃえ!


🌻  🌼  


ソーラー「そこで


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


ソーラー「よ~し


またまた


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


数値


1

2

3

4

5


を格納したよ」



🌻



       まずは ここからがはじまりだね


         

                             🌻



ソーラー「この

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


数値

1

2

3

4

5


が格納された状態を経てから


今度は


オープンモード"w"をつかってファイルを開き


以前保存された

数値

1

2

3

4

5


fscanf関数をつかって 


用意した配列に取り込み


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


printf関数を使って表示することができるか


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


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


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の場合


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

-858993460

-858993460

-858993460

-858993460

-858993460


(この値はメモリの使用状況によってことなってきます)


ソーラー「

オープンモード"a"のときと同様に


やはり(*^▽^*)

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


ハードディスクの


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


1

2

3

4

5

をよみこめないか・・・



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


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


書き込みしかできないよう設定されているため



今のプログラム

👇


#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の場合


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

-858993460

-858993460

-858993460

-858993460

-858993460


の中の


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



コンピュータのメモリに


ハードディスク内の


TEN-GOGO-C-language.txtファイルから


データを読み込めない


つまり、機能していないんだね。」


🌻


オープンモード"w"は


ハードディスク内のファイルに保存されているデータの


読み込み機能はなく


ハードディスク内のファイルへ


データの


書き込み機能しかないから やっぱり そうなるかな


                  🌻    



ソーラー

「となると


今のプログラムは


機能していない


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("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;

}


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



🌻

どうなる、どうなる?

🌼



コンパイル結果


EAZYIDECの場合


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

9

2

1703760

1964398416

1703808


Visual Studioの場合


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

-858993460

-858993460

-858993460

-858993460

-858993460



(これらの値はメモリの使用状況により異なってきます)



ソーラー 「やっぱり同じコンパイル結果


EAZYIDECの場合


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

9

2

1703760

1964398416

1703808


Visual Studioの場合


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

-858993460

-858993460

-858993460

-858993460

-858993460


がでてきたね


オープンモード"w"でも

オープンモード"a"のときのように


fscanf関数は機能していないんだ


そして


EAZYIDECの場合


9

2

1703760

1964398416

1703808


Visual Studioの場合


-858993460

-858993460

-858993460

-858993460

-858993460


とへんてこな数値がコンパイル結果にでてきたのは


配列宣言

int hairetu[5];

行って

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

作製したものの


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


配列の中の

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


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


数値データ


1

2

3

4

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


が実行された場合


配列変数が初期化されていない場合に


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている


モンスター数値

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


9

2

1703760

1964398416

1703808


がコマンドプロンプト画面に表示されるというわけなんだ・・・


まあ


もともと


             🍋オープンモード"w"🍋で



TEN-GOGO-C-languageファイルを開いた場合


TEN-GOGO-C-languageファイルを開いた瞬間に


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


保存されていた数値


1

2

3

4

5



消えてしまうので


たとえ


fscanf関数が機能していたしても


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


保存されていた数値


1

2

3

4

5


をコマンドプロンプト画面に表示することは


できなかったんだ


となると・・・ 


fscanf関数が機能していた場合


つまり


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


何もデータがはいっていない空白の状態のとき


fopen関数の設定を


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


のようにオープンモード"r"とし


fscanf関数を使って


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


その空白の状態を格納し


さらに


その空白の状態を配列に格納し


配列に格納されたデータを


printf関数をつかってprintf出力表示したら


コマンドプロンプト画面には何が表示されるのかな?


っておもっちゃったんだな~~


君はどう思う?」



🌻


何もデータが保存されていないハードディスク内のファイルを


オープンモード"r"で開き


fscanf関数を使ってデータを読み込み


コマンドプロンプト画面にそのデータを表示してみたら


何が表示されるのか?


それはおもしろそうなアイデアだね。


どうなるのかな?


🌼  🌼  🌼





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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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