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