オープンモード "w+"の読み込み機能について 考察してみよう 今のところ読み込み機能が働くところを観測できません。読み込み機能は機能していないかもしれません。 

次は


オープンモード "w+" , "r+", "a+" の読み込み機能について


順番に考察してみようよ\(^o^)/



ソーラー「いいね


そのためにはまず


次のプログラムをつかって


#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


をかきこんでみます


そして

書き込みと読み込みの両方の機能をもつ


オープンモード"w+"  

オープンモード"r+"

オープンモード"a+"


でハードディスク内のファイルを開くことにより


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

1

2

3

4

5

をfscanf関数を使って


配列宣言

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

により


数値

1

2

3

4

5

コマンドプロント画面に表示してみます


まずは

ハードディスク内のファイルに新規書き込みする機能と

ハードディスク内のファイルに保存されているデータを読み込む機能をもつ?(笑)


オープンモード"w+"  

ファイルを開いて


数値

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


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

(Visual Studioの場合)


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

9

2

1703760

1964398416

1703808

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



ソーラー「な、なんか


コンパイル結果をみると


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


ファイルに新規書き込みできる機能wに


ファイルデータを読み込む機能rが追加されてるはずなのに


読み取り機能が機能してないようなんだけど・・・」



🌻

ふふ??

どうしてかな?


このとき


PC内検索で


TEN-GOGO-C-language.txtファイルを探し出し


中身を確認しても


何もデータが保存してありません


オープンモード"w+" のはたらきにより


中のデータが消えてしまっています


ここが微妙な感じがするね(^_^)/


オープンモード"w+"にファイルデータ読み込み機能がついていたとしても


オープンモード"w+" のはたらきにより


中のデータが消えてしまっているなら


fscanf関数を使って、データをよみとれないね~。


オープンモード"w+"にデータ読み取り機能があっても


以前に保存されたデータが消えてしまったら


意味ないかもね~。


オープンモード"w+"でファイルを開いても


以前にファイルに保存されたデータ

1

2

3

4

5

消去されず

     


ファイルに保存されているデータの


読み取り機能rが普通に働いているなら


fscanf関数を使って

ハードディスク内の

TEN-GOGO-C-language.txtファイル内のデータである

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

により


コンパイル結果


1

2

3

4

5

が表示されるんだけど


実際は


TEN-GOGO-C-language.txtファイル内に何もデータが保存されてないので


fscanf関数が機能せず


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

は初期化されないので


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

が初期化されてないとき

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納されている数値

9

2

1703760

1964398416

1703808

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


🌻         🌻


ソーラー「そう、そうなんだ 


前のエピソードでもやったね


でも 

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


データを読み込もうとしてファイルを開くと


以前保存されたデータが消えてしまうんじゃ


データの読み取りようがないような感じがするんだけど・・・


オープンモード"w+"って??


何のために設計されたのかな?」



🌻 🌻 🌻 🌻 🌻 🌻

??


何とかオープンモード"w+"の読み込み機能をつかって


ファイルに保存されているデータをよみこめないかな・・


😊

   

 🌻    🌻     🌻


ソーラー「ふっ😊ははは


なんか


何とか


オープンモード"w+"の読み込み機能をつかって


ファイルに保存されているデータをよみこめないかな


って


今、ものすごいことを話し合ってるよね。


もう、しょうがないなあ。


オープンモード"w+"は読み取り機能があるってことになってるんだけど・・・😝


それができないとは・・・


     なんとかオープンモード"w+"の読み取り機能(笑)


がつかえるようがんばってプログラムを作製してみルンパッパ?」


🌻  🌻


ルンパッパ💖(^^♪

ルンパッパ💖(^^♪


🌻  🌻


ソーラー「

ルンパッパ💖(^^♪

ルンパッパ💖(^^♪




今のプログラムは


オープンモード”w+”で


ハードディスク内の

TEN-GOGO-C-language.txtファイルを開いたので


もともと


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


数値

1

2

3

4

5

は消去されてしまい


TEN-GOGO-C-language.txtファイルの中身は空白となっています。


そのファイル内の空白状態のデータを


fscanf関数をつかって配列の配列変数にとりこもうとしても


fscanf関数が機能せず、とりこむことができないんだね。


となると


配列の配列変数はとりこむはずだったデータにより初期化されないことになり


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


初期化されていない配列の配列変数に格納されている数値


9

2

1703760

1964398416

1703808

(この値はコンピュータのメモリの使用状況によってことなってきます)


がprintf出力表示された・・・


というわけなんだね。


ならば


オープンモード”w+”で


TEN-GOGO-C-language.txtファイルをひらいて


ファイルの中身がまっさらになった、


そのあとに


fprintf関数をつかって


数値


8

8

8

8

8


をファイルに書き込み


すぐに


その数値

8

8

8

8

8

fscanf関数を使って


配列宣言

int hairetu[5];


によって作製された配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


に格納し


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

に格納された

数値

8

8

8

8

8

をprintf関数を使って


コマンドプロンプト画面に表示したらいいんじゃないかな(´▽`*)


つまり


これなら


オープンモード"w+"の読み込み機能が機能したことになるよね。」




🌻🌻 それは 名案! 🌻🌻




ソーラー「

そのプログラムは

以下のようになります


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

/*このときすでに

オープンモード"w+"の働きにより

TEN-GOGO-C-language.txtファイル内のデータは消去されています*/


fprintf(fp,"%d\n",8);

fprintf(fp,"%d\n",8);

fprintf(fp,"%d\n",8);

fprintf(fp,"%d\n",8);

fprintf(fp,"%d\n",8);

/*これらのfprintf文で

空白となったTEN-GOGO-C-language.txtファイルに


新たに

数値を

8

8

8

8

8

を格納します*/


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

/*

8

8

8

8

8

fscanf関数をつかって

読み取って


配列変数

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


fclose(fp);

return 0;

}


ソーラー「これならどうかな?


いけるんじゃないかな?」




🌻🌻🌻🌻🌻🌻


これなら オープンモード"w+"のデータ読み込み機能をつかって


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


数値

8

8

8

8

8


を表示できそうだね💖


🌻 🌞 🌻 🌞



ソーラー「あはは


そうだよね~ これなら


数値

8

8

8

8

8


をコマンドプロンプト画面に表示させることができると思うな


これなら 行ける!!と思うな


それでは


このプログラムを


コンパイルっ」


コンパイル結果


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

9

2

1703760

1964398416

1703808


ソーラー「な、なんで


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

fscanf関数を使って


8

8

8

8

8

配列変数に格納できていない・・・


だから

配列変数の中身をprintf出力表示しても


8

8

8

8

8

が表示されない・・・」


🌻


🌞?????


なぜかな??



TEN-GOGO-C-language.txtファイルを閲覧してみると


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


数値

8

8

8

8

8



ちゃんと保存されてるよ」


ソーラー「う~んん??」


🌻  🌻


!!わかっちゃった


今の例の場合で


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


ファイルデータの読み込み


をおこなうことはできませんでした。


なぜなら


fscanf関数を使用する前に


fprintf関数を使用しているからなのです


つまり


先のエピソードでもみてきたように


fscanf関数を使用したあと


fprintf関数を使いたいなら


fclose関数を使ってファイルを閉じ


再びオープンモードの設定をおこなってファイルを開く


必要があるのだけど


今のプログラムでは


その


fclose関数を使ってファイルを閉じ


再びファイルポインタ変数宣言をおこなってファイルを開く


という命令文がぬけています。


🌼  🌼


ソーラー「ナイス よくわかったね、すごいな」


🌻🌻


だから正しいプログラムは


fclose関数を使ってファイルを閉じ


再びファイルポインタ変数宣言をおこなってファイルを開く


という命令文


を追加した


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

/*このときすでに

オープンモード"w+"の働きにより

TEN-GOGO-C-language.txtファイル内のデータは消去されています*/


fprintf(fp, "%d\n", 8);

fprintf(fp, "%d\n", 8);

fprintf(fp, "%d\n", 8);

fprintf(fp, "%d\n", 8);

fprintf(fp, "%d\n", 8);

/*これらのfprintf文で

空白となったTEN-GOGO-C-language.txtファイルに


新たに

数値を

8

8

8

8

8

を格納します*/

fclose(fp);//☆☆追加した部分はここです☆☆

fp = fopen("TEN-GOGO-C-language.txt", "w+");//☆☆ここです☆☆

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

/*

8

8

8

8

8

fscanf関数をつかって

読み取って


配列変数

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


fclose(fp);

return 0;

}


となるんだね


🌼  🌼


ソーラー「よし準備完成!


あとは


このプログラムをコンパイルしてみる!」



ソーラー「コンパイル!」








コンパイル結果


(EAZY IDECの場合)

(Visual Studioの場合)


9

2

1703760

1964398416

1703808

(この値はコンピュータのメモリの使用状況によってことなってきます)



ソーラー「


あ だめだこりゃ


結局


fscanf関数を使用したあと


fprintf関数を使用しようとして


fclose関数を使ってファイルを閉じ


再び


ファイルポインタ変数宣言と


オープンモードの設定w+をおこなってファイルを開いても


オープンモードw+でファイルを開いてしまうから


fprintf関数によって


ファイルに保存された

8

8

8

8

8


消去されてしまい


fscanf関数をつかって


データを読み込むことはできないということなんだ」



🌻  🌻

結局のところ


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


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


おこなうことはできません。

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

作者を応援しよう!

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

応援したユーザー

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