天国にいけるC言語入門 ヘキサ構造体 ver5.2130
ファイルを閉じて書き込みモードを解除せずに新たにファイルポインタ変数宣言を行って読み込みモードでファイルを開いてもfscanf関数を使ってファイルデータを読み込むことはできません。
ファイルを閉じて書き込みモードを解除せずに新たにファイルポインタ変数宣言を行って読み込みモードでファイルを開いてもfscanf関数を使ってファイルデータを読み込むことはできません。
ソーラー「
同じプログラム内で fprintf関数を使って保存された数値を fscanf関数を使って配列に取り込むにはデータを保存後1度ファイルを閉じて書き込みモードを解除する必要があります。
面白い仕組みになってるね🌞」
🌻
🌞そうだね🌞
🌼
ソーラー「1度、ファイルを閉じて書き込みモードを解除してから
再び
読み込みモードでfopen関数の設定をおこない
ファイルを開くんだよね。
先程の例では
fclose(fp);
を行って書き込みモードを解除した後
fopen関数の設定
fp=fopen("TEN-GOGO-C-language.txt","a+");
を行い
読み込み機能と書き込み機能をもつオープンモード"a+"でファイルを
開いたよね。
そうすることにより
ハードデイスク内に保存されたファイルデータを
fscanf関数を使って読み取ることができるようになるわけなんだね。
そのプログラムは
次のように記述されたかな
#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);
/*TEN-GOGO-C-language.txtが書き込みのみできる状態を解除しました*/
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","a+");
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
/*TEN-GOGO-C-language.txtファイルを閉じたので
そのままでは
TEN-GOGO-C-language.txtファイルに格納された数値データを
よみとることができないので
再び
ファイルポインタ変数宣言とオープンモード"a+"の設定を行いました。
Visual Studioをお使いの方は、
2度目のファイルポインタ変数宣言
FILE *fp;
は記述しないでください
ビルドエラーになります
*/
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!ファイルオープンに成功しましたよ~ん
Hello!ファイルオープンに成功しましたよ~ん
1
2
3
4
5
ソーラー「
👆
このプログラムのように
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);
が実行されて
ファイルに数値データ
1
2
3
4
5
が格納された後
fclose(fp);
を行い
書き込みモードを解除しないといけないというわけなんだね。
fclose(fp);
を行うと
書き込みモードを解除できるけど
このままではファイルが閉じられたままで
読み込みができないから
ふたたび
ファイルポインタ変数宣言とfopen関数の設定
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","a+");
(Visual Studioをお使いの方は、FILE *fp;を記述しないでください
ビルドエラーになります
)
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
を行う必要があるんだね。
そして
今は
読み込みも書き込みもできる
オープンモード"a+"でファイルが開かれたわけだけど
オープンモード"a+"が
読み込みモードになるか書き込みモードになるかは
最初に
読み込みできるfscanf関数を使うか
書き込みできるfprintf関数を使うかによって決まるので
オープンモード"a+"でファイルが開かれた後すぐに
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]);
の命令文が実行されると
オープンモード"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]);
により
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
に
fprintf関数によってたった今
TEN-GOGO-C-language.txtファイルに保存された
数値
1
2
3
4
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]);
が実行されると
コマンドプロンプト画面に
1
2
3
4
5
が表示される。
ということになるんだね。
さあて\(^o^)/
このプログラムで
fclose(fp);
を行って
書き込みモードを解除しなかったら
どうなるかな
ねえ どう思うかな?
🌻
それは つまり
fclose(fp);
を行なって
書き込みモードを解除しなくても
新たに
ファイルポインタ変数宣言とfopen関数の設定
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","a+");
さえ行ってしまえば
fscanf関数を使って
ハードデイスク内のTEN-GOGO-C-language.txtファイル
のデータを読み込むことができるんじゃない?
ということかな」
ソーラー「ビンゴ その通りだね。
何も言わなくても分かってもらって嬉しくなっちゃうな。」
🌻
はは🌞🌞🌞
どういたしまして
あなたとお話しできて
私も嬉しいかな
🌼
ソーラー「では
先程の
プログラムで
fclose(fp);
を行なって
書き込みモードを解除しなくても
新たに
ファイルポインタ変数宣言とfopen関数の設定
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","a+");
さえ行ってしまえば
fscanf関数を使って
ハードデイスク内のTEN-GOGO-C-language.txtファイル
のデータを読み込むことができるかどうか
試してみよう。
さあ
先程のプログラムで
fclose(fp);
をとりのぞいても
同じコンパイル結果が得られるかな?
#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);を削除しました☆☆*/
FILE *fp;
fp=fopen("TEN-GOGO-C-language.txt","a+");
if(fp==NULL){
printf("ファイルオープンに失敗しましたよ~ん\n");
return -1;}
/*TEN-GOGO-C-language.txtファイルを閉じたので
そのままでは
TEN-GOGO-C-language.txtファイルに格納された数値データを
よみとることができない?
とおもい
再び
ファイルポインタ変数宣言とオープンモードの設定を行いました。
(Visual Studioをお使いの方は、
ファイルポインタ変数宣言
FILE *fp;
は記述しないでください
ビルドエラーになります)
*/
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
(この値はコンピュータのメモリの使用状況によって異なってきます。)
ソーラー「あっ
やっぱり
fclose(fp);
を行って書き込みモードを解除しなければ
fscanf関数を使って
ハードデイスク内の
TEN-GOGO-C-language.txtファイルに格納された数値データを
読み取ることができないみたいだね。」
🌻🌻
面白いね
🌼🌼
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます