天国にいけるC言語入門 ヘキサ構造体 ver3.2128
オープンモード "w+"の読み込み機能について 考察してみよう 今のところ読み込み機能が働くところを観測できません。読み込み機能は機能していないかもしれません。
オープンモード "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+"は
ハードディスク内に保存されたファイルのデータの読み込みを
おこなうことはできません。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます