1つのファイルポインタ変数を使い複数のファイルのデータの読み込み、書き込みを実行してみましょう。ファイルポインタ変数の仕組みをもう少し詳しく観察してみましょう。

ねえ、ソーラーさん


オープンモード"a"って何のことかわかる?


いままでコンピュータのハードディスク内のファイルを開くときには


まず、初めに


必ず


ファイルポインタ変数宣言とfopen関数の設定


FILE *fp;

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


をおこなってファイルを開いたね。


ファイルを開かないと


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


ファイル構造体を通して


コンピュータのメモリに


データを読み取ったり


保存したいデータを


ファイル構造体を通して


メモリに格納することにより


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


データを保存したりできないんだね。


🐤    🐤


ソーラー 「ええ、そう、そうやって


まずはファイルがオープンされ


文字列 Hello!るんるんworldや


文字列 Hello!worldが


ハードディスク内の自作ファイルにかきこまれ保存されていたんだ。」


🌻   🌻


前のエピソードで見てきたように 


ファイルポインタ変数宣言とfopen関数の設定


FILE *fp;

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


を行い


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


文字列Hello!るんるんworldをかきこんだあと


ファイルを閉じていったんプログラムを終了し


再び

ファイルポインタ変数宣言とfopen関数の設定


FILE *fp;

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


を行い


自作ファイルTEN-GOGO-C-language.txtをオープンし


(このときオープンモード"w"で


TEN-GOGO-C-language.txtファイルが開かれているため


ファイルはまっさらに設定し直され


以前にファイルに保存した


文字列データ

Hello!るんるんworld


は消えてしまいます)


TEN-GOGO-C-language.txt内に


fprintf関数をもちいて


文字列Hello!worldを保存すると


新たに 保存した文字列Hello!worldだけが


ハードディスク内のTEN-GOGO-C-language.txtファイルに保存されます


どう?


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


もう


PC内を検索して


みた? みた?


🌼  🌼



ソーラー「いた にた みたよ~\(^^)/」



🌻


みた?😊



このようにハードディスク内のファイルを


オープンモード"w"をもちいて


ひらくと


ファイルは初期化され


前に保存されていたデータは消えてしまう


そして


その状態から新たにデータをかきこんでいく・・・


これが 


オープンモード"w"でファイルが開かれたときの状態でした



fpのファイルポインタ変数宣言とfopen関数の設定


FILE *fp;

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


において


fopen関数の第2引数が"w"になっていれば


オープンモード"w"になってるんだよ


🌼


ソーラー 「つまり


ファイルを開くとき


第2引数が"w"と記述された状態(オープンモード"w")で


前に自作したファイルを開いた場合、前のデータは


消えちゃうのか」



🌻  🌻


もちろん、オープンモード"w"でも


       ☆新たに自作ファイル名を変えて☆


ファイルポインタ変数宣言とfopen関数の設定を実行し


新たな自作ファイルを作製しオープンモード"w"で開いた場合は


新たな自作ファイルとは別名のファイルに保存しておいたデータが


きえてしまうことはありません



そしてfprintf関数を使って入力したデータはもちろん


新しい自作ファイルに保存されます。


🌼  🌼


ソーラー「


オープンモード"w"で新たなファイルを開いたからと言って


全然関係ない別のファイルに保存されているデータが消えてしまうことは


ないってわけだね


きみ、」



🌻



そう そう


     🌼



ソーラー「そ~なると


以前に


FILE *fp;

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

のような


ファイルポインタ変数宣言とfopen関数の設定で


データを保存したTEN-GOGO-C-language.txtファイル


があるとする。


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


保存されたデータを消したくないので


新しく

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


別名で


作製するとするよね。


そのときは

ファイルポインタ変数宣言とfopen関数の設定を


次のように記述し


FILE *fp2;

fp2=fopen("TEN-GOGO-C-language2.txt","w");



🍓🍓🍓ファイルポインタ変数宣言で🍓🍓🍓


🍓🍓fpでなく新たに別のファイルポインタ変数名fp2を記述し🍓🍓


さらに


🍓🍓🍓fopen関数の第1引数に🍓🍓🍓


🍓🍓🍓TEN-GOGO-C-language.txtでなく新たに別のファイル名


TEN-GOGO-C-language2.txtを記述して🍓🍓🍓


新しいファイルをハードデイスク内に作製することになるのかな?」


🌻


追加で以前作成されたファイルにデータを保存するのでなく


新しく別のファイルを作製したいということなのかな?


・・

実はこの場合は


ファイル名さえかえれば


ファイルポインタ変数名はfp2と変更しなくても


fpのままでもいいんだよ~。


🌼



ソーラー「えっ?はぇ?」



🌻

FILE *fp2;

fp2=fopen("TEN-GOGO-C-language2.txt","w");


でなく

ファイル名だけを変えた


FILE *fp;

fp=fopen("TEN-GOGO-C-language2.txt","w");


でもいいんだよ。


どう?


🌼


ソーラー「???へ?」  


🌻


FILE *fp;

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


のファイルポインタ変数宣言とfopen関数の設定が行われ



TEN-GOGO-C-language.txtファイルが開かれて


fclose(fp);


の実行により閉じられると


ファイルポインタ変数fpをつかって


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


アクセスすることはできなくなります




ですので


TEN-GOGO-C-language.txtファイルが開かれて


閉じられたあとに


新たに

fp=fopen("TEN-GOGO-C-language2.txt","w");


を実行して


別のTEN-GOGO-C-language2.txtファイルを開くときには


ファイルポインタ変数宣言とfopen関数の設定で


ファイルポインタ変数fpを使用することが可能となります。


同じファイルポインタ変数fpを使用しても


TEN-GOGO-C-language.txtファイルは閉じられて


アクセスできない状態になっているので


TEN-GOGO-C-language.txtファイルに保存されているデータに


TEN-GOGO-C-language2.txtファイルデータの


データが上書きされるということはないというわけです


そして1番の理由は


fp=fopen("TEN-GOGO-C-language2.txt","w");


により


ファイルポインタ変数fpには戻り値として


TEN-GOGO-C-language2.txtにアクセスするためのメモリのアドレスが


格納されているというところにあります


ですので


さらに


新たに別のファイルTEN-GOGO-C-language3.txtを開く


fp=fopen("TEN-GOGO-C-language2.txt","w");


を実行したならば


ファイルポインタ変数fpには


戻り値としてfopen関数に返された


TEN-GOGO-C-language3.txtにアクセスするためのメモリのアドレスが


格納されることになるので


TEN-GOGO-C-language3.txtにしかデータは保存されないことになります


だから


新たに別のファイルポインタ変数をつかうことなく


同じファイルポインタ変数fpがつかえるんだね。


実際に


次のプログラムのように


同じファイルポインタ変数fpをつかって


Nyannta.txtファイル

NekoNeko.txtファイル

2つの


ファイルの


ファイルオープン


ファイルクローズをおこなってみますね


EAZY IDECの場合


#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

fp=fopen("Nyannta.txt","w");

if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");

fputs("Hello!るんるんworld\n",fp);


fclose(fp);



FILE *fp;

fp=fopen("NekoNeko.txt","w");

if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");

fputs("Hello!るんるるんるんworld\n",fp);


fclose(fp);

return 0;

}


コンパイル結果


EAZY IDECの場合

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

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


1度に2つのファイル


Nyannta.txtファイル

NekoNeko.txtファイル

を作製、開き閉じる場合でも


ファイルポインタ変数は同じfpでもよいのです。


Visual Studioの場合では


同じ変数名をもちいて2度


ファイルポインタ変数宣言をおこなうことはできないので


2度目のファイルポインタ変数宣言


FILE *fp;


は記述しないでください


そのプログラムはこちらです

👇


Visual Studioの場合


#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

fp=fopen("Nyannta.txt","w");

if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");

fputs("Hello!るんるんworld\n",fp);


fclose(fp);


fp=fopen("NekoNeko.txt","w");//ここではファイルポインタ変数宣言FILE *fp;は記述しません NekoNeko.txtにアクセスするためのメモリのアドレスが戻り値としてfopen関数に返されます

if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");

fputs("Hello!るんるるんるんworld\n",fp);


fclose(fp);

return 0;

}


コンパイル結果


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

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



🌻  🌻


1つ目の


ハードディスク内のNyannta.txtファイル


が作製され


、開き閉じられると


ファイルポインタ変数fpを使って


Nyannta.txtファイルにアクセスして


Nyannta.txtファイルにデータをかきこむことはできなくなります。


ハードディスク内のNyannta.txtファイル


が作製、開き閉じられる場合でも


1度目のファイルポインタ変数宣言


FILE *fp;


によって生成されたファイルポインタ変数fp


は機能しています


ですので


ハードディスク内のNyannta.txtファイル


が作製、開き閉じられたすぐ後に


新たに


ハードディスク内にNekoNeko.txtファイル


を作製、開く場合に


ふたたび

fpのファイルポインタ変数宣言


FILE *fp;


を行うことなく


1度目のファイルポインタ変数宣言


FILE *fp;


により設定された


ファイルポインタ変数fpを使うことができるんです。


つまり


FILE *fp;//👈ここは記述する必要はありません

fp=fopen("NekoNeko.txt","w");


を全部記述する必要はなく


fp=fopen("NekoNeko.txt","w");


だけを記述すればいいのですね。


fp=fopen("NekoNeko.txt","w");


が実行されると


ファイルポインタ変数fpには戻り値としてfopen関数に返された


NekoNeko.txtファイルにアクセスするためのメモリのアドレスが


格納されることになるので


NekoNeko.txtファイルにしかデータは保存されないことになります


NekoNeko.txtファイルが開かれ


ファイルポインタ変数fpをもちいて


NekoNeko.txtファイルにデータをかきこむことができる状態になっているというわけです



ですので


実はやってはいけませんが



  🍓複数のハードディスク内のファイルをオープンするごとに🍓



        🍓🍓ファイルを閉じなくても🍓🍓


   

🍓複数のハードディスク内のファイルを開きっぱなしのまま🍓



同じファイルポインタ変数fpをつかって


複数のファイルのうち最後に開かれたファイルにアクセスして


データを保存することができます


このとき


格納されるデータが


他のファイルにまちがって格納されることはありません


🌼


ソーラー「なるほど


ファイルが開かれるたびに


ファイルポインタ変数fpには


戻り値としてfopen関数に返された


その開かれたファイルにアクセスするためのメモリのアドレスが


格納されることになるので


その開かれたファイルにしかデータは保存されないことになるってわけなんだね


🍓複数のハードディスク内のファイルを開きっぱなしのまま🍓


ファイルポインタ変数fpを使ってファイルにデータ格納なんかしたら


いろんなファイルにこんがらがってデータが格納される


ということはないわけなんだね


🌻


そのことについては次のエピソードでも お話してみようよ


別にたいしたことじゃないんだけど


ちょっとながくなりすぎちゃった。

   🌼   🌼    🌼




ソーラー「すご~い」



ソーラー「そうだね ここで お昼ごはんにしよう。」



緑の草原で包みをひろげて


おにぎりを取り出すソーラー

 


🌻       🌻


はは ソーラーさん


オープンモード"w"の状態


ファイルポインタ変数の仕組み


なんとなく理解できた?


 🌼    🌼    🌼 

  🌼    🌼    🌼 

 🌼    🌼    🌼


ソーラー「オープンモード"w"の状態だけでなく


ファイルポインタ変数の仕組みもよく理解できたよぉ


それにしても・・


オープンモード"w"の状態で


ファイルを開くと


まえにファイルに格納されたデータがきえてしまう


いままでうちこんだ


データが全部、全部ぅ~


きえてしまうのはもったいないな~


そう思わない?」


🌻🌻

そう


そこで登場するのが


新たなオープンモード


オープンモード"a"なんです。


オープンモード"a"を使えば


以前ファイルに保存されたデータを残したまま


以前ファイルに保存されたデータに追加してデータを保存することができます。


🌼  🌼

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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