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"でファイルが開かれたときの状態でした



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


FILE *fp;

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


において


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


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


🌼


ソーラー 「つまり


ファイルを開くとき


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


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


消えちゃうのか」



🌻  🌻


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


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


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


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


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


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



そして打ち込んだデータはもちろん


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


🌼  🌼


ソーラー「


オープンモード"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ファイルが開かれて


閉じられると


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


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


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




ですので


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


閉じられたあとに


新たに


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


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


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


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


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


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


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


TEN-GOGO-C-language2.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");

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ファイル


が作製、開き閉じられると


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


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


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


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


が作製、開き閉じらても


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


FILE *fp;


は機能しています


ですので


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


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


新たに


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


を作製、開く場合に


ふたたび


FILE *fp;


を行うことなく


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


FILE *fp;


により設定された


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


つまり


FILE *fp;

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


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


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


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


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


が実行されると


NekoNeko.txtファイルが開かれ


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


NekoNeko.txtファイルにデータをかきこむことができるようになります



ですが


実は



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



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


   

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


つまり


     🍓複数のハードディスクのファイルに🍓

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



    🍓アクセスすることができる状態のまま🍓



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


複数の別のファイルにアクセスして


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


このとき


格納されるデータが


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


🌼


ソーラー「ええ!?


なんでぇ


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


つまり


    🍓複数のハードディスクのファイルに🍓

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



    🍓アクセスすることができる状態のまま🍓


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


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



🌻


そのことについては次のエピソードで


ということでいいかな?


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


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

   🌼   🌼    🌼




ソーラー「すご~い」



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



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


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

 


🌻       🌻


はは ソーラーさん


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


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


なんとなく理解できた?


 🌼    🌼    🌼 

  🌼    🌼    🌼 

 🌼    🌼    🌼


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


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


それにしても・・


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


ファイルを開くと


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


いままでうちこんだ


データが全部、全部ぅ~


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


そう思わない?」


🌻🌻

そう


そこで登場するのが


新たなオープンモード


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


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


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


追加してデータを保存することができます。


🌼  🌼

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

作者を応援しよう!

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

応援したユーザー

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