fputs関数とfprintf関数を用いてハードディスク内のファイルにデータを書き込みます。このときまずデータはファイル構造体を通してメモリに格納されてからハードディスク内のファイルに保存されます

#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");

fclose(fp);

return 0;

}


コンパイル結果(EAZY IDECの場合)

ビルド結果(Visual Studio)の場合


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


ソーラー「

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


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


ふふふ


ふふふふふ


ついに ハードディスク内に


TEN-GOGO-C-language.txtファイルを作成し


オープンモード"w"で開くこともできた!(^^)!


このTEN-GOGO-C-language.txtファイルにデータを書き込めるわけだ


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


データを保存するんだ!


これは大きな前進だぁっ



~ ~ ~ ~ ~

         ~ ~ ~ ~ ~

🌻  🌻     

はい、はい、


今、作製したTEN-GOGO-C-language.txtファイルに文字列データを書き込むには


fputs関数をもちいます。


fputsとは


file(ファイル) putsの略です


puts関数はコマンドプロンプト画面に文字列を表示する関数でした


つまり


fputs関数は


ハードディスク内に作成されたファイルに


文字列を書き込む関数というわけです



fputs関数で文字列を


ハードディスク内に作成されたファイルに書き込む書式は


fputs(文字列データ、ファイルポインタ変数);


となっています。


fputs関数の第1引数は文字列データ


第2引数には


ファイルポインタ変数を指定します。


ファイルポインタ変数は


ポインタ変数なのでアドレスを格納することになるんだけど


なんのアドレスを格納するかというと・・」


🌻

そこは わたしが 引き継ごうかな



fputs関数をもちいて


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


はどのようにかきこまれていくのかな?


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


FILE *fp;

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


がおこなわれたなら


ファイル構造体が作製されます。


ハードデイスクのファイルを読み取るときは


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



ファイルのどの位置にそのデータがかきこまれているか


等のデータは


ファイル構造体をとおしてメモリに格納されることになります


データがメモリに格納されるごとに


そのデータに対応した値が*fpに格納されることになります


また


ハードデイスクのファイルにデータを保存するときも


保存したいデータ



ファイルのどの位置にその保存したいデータをかきこみたいか


等のデータは


ファイル構造体をとおしてメモリに格納されることになります。


ハードディスク内のファイルからデータを読み取るときは


保存されているデータは


ファイル構造体をとおしてメモリに格納されることになります。



そして


データがメモリに格納されるごとに


そのデータに対応した値が*fpに格納されることになります


*fpの値は変化していくのです


ですので


*fpの値は


ハードディスク内のファイルからデータをすべて読み取りきったときと


データを読み取る途中の値ではことなってきます。


ハードディスク内のファイルからデータを読み取るのでなく


ハードディスク内のファイルにデータをかきこむときも


書き込みたいデータは


ファイル構造体をとおしてメモリに格納されることになります。


書き込みたいデータがメモリに保存されたとき


*fpの値は変化します。


ですので


書き込みたいデータがすべて


ファイル構造体をとおしてメモリに格納されたとき


最後にメモリに保存されたデータに対応する値を


*fpはもつことになります。


オープンモード"w"でTEN-GOGO-C-language.txtファイルが


開かれる、作製されるような場合は


オープンモード"w"の性質から


TEN-GOGO-C-language.txtファイル内には何もデータが


入っていないので


ハードディスク内のファイルからデータを読み取る際のように


ファイル構造体を通して


メモリに


ハードディスク内のファイルデータが格納されることはありません。


ここでまずは


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


考察してみましょう


fputs関数を用いて文字列データを


ハードディスク内のファイルに保存する際


ハードディスク内のファイルに保存される前に


文字列データは


まず


ファイル構造体を通して


コンピュータのメモリに格納されます。


このとき


文字列データは


コンピュータのメモリに保存されていくのですが


最後に格納された文字列データに対応した値が*fpに


格納されることになります。


文字列データは


まず


ファイル構造体を通して


コンピュータのメモリに格納されたのちに


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


文字列データの保存が実行され


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


文字列データは保存されます



fputs関数の第2引数の


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


保存したいデータをファイル構造体を通して


メモリに格納するはたらきがあります


ここでもう1度説明してみる?

🌻



ソーラー「は~い\(^o^)/お願いしま~す」




🌻  🌻

ハードディスク内のファイルに文字列データを書き込む場合


ファイル構造体を通して


文字列データがメモリに格納されることになりますが


最後に格納された文字列データに対応した値が


*fpに格納されることになります。


文字列データが


ファイル構造体を通して


メモリに格納されていくたびに


その文字列データに対応した値が


*fpに格納されることになります。



つまり

*fpの格納している値はどんどん移りかわっているわけです。


ハードディスクのファイルに保存されているデータを読み込み


また


ハードディスクのファイルにデータを書き込みする際にも


メモリが関係してきます


コンピュータが


データをとりあつかうとき


まずデータをコンピュータのメモリに格納するというのは


コンピュータシステムの基本事項でしたね。



fputs関数は


ハードディスク内のファイルにデータを書き込む関数なのですが


データを書き込むには


もちろんのことですが


すでにハードディスク内にデータを書き込むためのファイルが存在して


いる必要があります😊


まえもって


FILE *fp;

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


のような


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


ファイル構造体と


ハードディスク内にTEN-GOGO-C-language.txtファイルを作製し、


ファイルをオープン(アクセスできる、つまり読み書きできる状態に)


していなければいけません。



うふふ さすがに


ファイル構造体も


ファイルもなく開かれてもいなければ


fputs関数をもちいて文字列データをメモリに書き込み


ファイルにデータを保存できないからですね。


FILE *fp;

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


において


fopen関数の


(どのようにファイルをオープン(アクセスできる状態に)するかを


指定する)第2引数には


オープンモード"w"がつかわれています


オープンモード"w"がfopen関数の設定で用いられた場合


ハードディスク内のTEN-GOGO-C-language.txtファイルに新規書き込みできる状態で


TEN-GOGO-C-language.txtファイルはオープンされます(開かれます)。


この新規書き込みできる状態でTEN-GOGO-C-language.txtファイルが開かれると


その瞬間(もしTEN-GOGO-C-language.txtが以前に作成されデータが保存されていたとしても)


今までハードディスク内のTEN-GOGO-C-language.txtファイルに保存されていたデータがすべて消え


新たにゼロから かきこめる状態にTEN-GOGO-C-language.txtファイルは設定しなおされます。


実際に


fputs関数をもちいて


ハードディスクに自作したファイルに文字列のデータを


かきこんでみましょうよ


🌻  🌻


ソーラー「やってみよう


どのようにハードディスク内のファイルにデータをかきこんでいくのかな?


とりあえず プログラムを作製し コンパイルしてみると


#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");


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


/*この命令文でハードディスク内のTEN-GOGO-C-language.txtファイルに

文字列 Hello!るんるんworld の書き込みを 行っています

簡単ですね*/


fclose(fp);

return 0;

}


コンパイル結果


EAZY IDECの場合

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


Visual Studioの場合

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



ソーラー「コンパイル結果には


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


しか記述されていないけど


これでいい? 簡単だね


fputs関数の


第1引数には文字列データ "Hello!るんるんworld\n"



第2引数には 


ハードディスク内に

文字列データがかきこまれるとき


まず


ファイル構造体を通してその文字列データはコンピュータのメモリに格納されるのですが


その役割をはたす


ファイルポインタ変数fp


かきこめば いいだけだもんね


このように


"Hello!るんるんworld\n" を


ハードディスク内のTEN-GOGO-C-language.txt


に書き込むとき


まず


文字列データ


"Hello!るんるんworld\n"は


ハードディスク内のファイルに保存される前に


ファイル構造体をとおして


コンピュータのメモリに格納されるというわけなんだね。



//改行の働きをするエスケープシーケンス\nも文字列データとして


メモリに格納されます//




その後



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


文字列


Hello!るんるんworld


が格納されるんだけど


オープンモード"w"でTEN-GOGO-C-language.txtファイルは開かれているので


ハードディスク内のTEN-GOGO-C-language.txtファイルには何もデータがない状態だったので


文字列


Hello!るんるんworld(改行)だけが


ハードディスク内のTEN-GOGO-C-language.txtファイルに格納されることになるわけだ。


ファイル構造体をとおして


コンピュータのメモリに文字列データが格納されるんだけど


それらのメモリは


文字列データを一時的に保存している置き場になってるんだね。


このように


文字列データ


"Hello!るんるんworld\n"は


メモリに格納されてから


ハードディスク内のファイルに保存されるんだね。


ところで


scanf("%d",&a);


のように


scanf関数を使って整数値データをメモリに格納するときも


格納される整数値データは


コンピュータ内のアドレス&aのメモリに格納されてたよね。


ファイルポインタ変数fpも


アドレス&aと同じ働きをしていて


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


ファイルポインタ変数fpが格納しているアドレスのついたメモリに


あつめられているわけだ。」



🌻🌻🌻


そうっ データをコンピュータのメモリに


格納するのに


アドレス、ポインタ変数をつかうのは


いろいろな場面でよく見られるパターンですね




そして


ハードディスク内に作製されたTEN-GOGO-C-language.txtファイルに


データを保存した後は


最後に


fclose関数によって


ハードディスク内に作製されたTEN-GOGO-C-language.txtファイルに


アクセスできないよう


ファイルを閉じて完成です。


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


ハードディスク内に作製されたTEN-GOGO-C-language.txtファイルに


アクセスして


データを読み書きすることはできません


いや?


カクヨムだった?


🌻🌻



ソーラー「コンパイル結果は


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


と表示されるのみで


      Hello!るんるんworldは表示されてないけど・・


これは ははあ


fputs関数は


コマンドプロンプト画面に文字列データを表示するのでなく


ハードディスク内のファイルに文字列データを書き込むみたいだね。


だから文字列


      Hello!るんるんworld



コマンドプロンプト画面に表示されないんだ」


🌻 🌻

そうなんです


fput関数はコマンドプロンプト画面でなく


ハードディスク内のファイルに文字列を書き込むのです


ソーラーさん、


実際に


TEN-GOGO-C-language.txtに


文字列Hello!るんるんworldが保存されているか


確かめてみましょうよ。


🌻


ソーラー「じゃあ、PCの検索欄から 


ファイルを検索してみようかな



PCのデータ検索欄で


検索場所:PCを


指定して


検索欄に


TEN-GOGO-C-language.txtとうちこんでっ💖


検索すると


でてきたっ でてきたっ


TEN-GOGO-C-language.txtファイルが(*´▽`*)


TEN-GOGO-C-language.txtファイルの中身は・・・



Hello!るんるんworld



できてる💖、できてる💖



これでもう、


ハードディスク内の自作ファイルにデータを保存できるんだもん


これがどれほどの進展となるか😊


もう、世界はるんるんだよ~」


🌻


そう😊よかったね


では次は


fprintf関数をつかって


ハードディスク内のファイルに文字列を保存してみましょうよ。


fprintfはfile printfの略です


つまり ハードディスク内のファイルに文字列をprintf出力表示する、


書き込む関数というわけです


fprintf関数はfputs関数とおなじようなはたらきをします。


ハードディスク内のファイルに文字列を書き込むには


puts関数のかわりにfputs関数をもちいたように


printf関数でなくfprintf関数をもちいます。


このfprintf関数を使うときでもfputs関数の時と同じく


まずはデータを保存するためのファイルが存在し


ファイルが開かれている必要があります。


そのために


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


FILE *fp;

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


を実行して


ファイル構造体



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


を作製して


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


オープンモード"w"でオープンします。


この状態では


まだ


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


何もデータが保存されていない状態となっています


fprintf関数をもちいたプログラムは


次のように(*^▽^*)なります


#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,"Hello!world\n");

/*fputs関数の代わりにfprintf関数をもちいました*/


fclose(fp);

return 0;

}



プログラムの実行結果



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


(*^▽^*)/


このプログラムが実行されると


ファイル構造体をとおして


文字列データ


"Hello!world\n"



メモリに格納されます


メモリに


文字列データ


"Hello!world\n"



格納されれば



ハードディスク内の


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


文字列


Hello!world

(改行)👈まあ、かわいらしい


保存されることになります


ね ソーラーさん


🌼


ソーラー「そうだね


さてさて・・・


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

の中身はどうなっているかな・・・



ちゃんと


Hello!world


になってる。


オープンモード"w”だから 前に


TEN-GOGO-C-language.txtファイルに書き込んだ


Hello!るんるんworld



初期化されて消えて


Hello!worldだけが保存されたんだね😊


Hello!worldか・・・


はじめてプログラムを組んだ時のコンパイル結果も


Hello!world


いい文章だね。」



ふふっ そう、そう😊


そこから はじまったものね


ここで


fputs関数とfprintf関数の違いは


puts関数とprintf関数の違いと同じで


fputs関数は


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


と記述し


文字列だけをファイルに保存できるのにたいし


fprintf関数は文字列だけでなく


出力変換指定子をもちいて


例えば、変数aに格納された値10を


次のように記述し


int a;

a=10;

fprintf(fp,"お店の開店は%d時です\n",a);


変数aに格納されている数値データ10



文字列データの中の%d出力変換指定子の部分にとりこみ



お店の開店は10時です




ハードデイスク内のファイルに書き込むことができます。


ソーラーさん


fputs関数とfprintf関数では


記述する際


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

fprintf(fp,"お店の開店は%d時です\n",a);


のように


ファイルポインタ変数fpの位置が違うことに注意かな


🌼🌼


ソーラー「んじゃ


変数aに格納された数値データ10をハードディスク内の自作ファイルに書き込んでみよう


わおう 画期的だね!


プログラムを組んでコンパイルしてみるよ


#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 a;

a=10;

fprintf(fp,"%d\n",a);

fclose(fp);

return 0;

}


コンパイル結果


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


またまたファイルを


PCの中から検索してみると・・・


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


10・・・


fprintfをつかって10がファイルに保存されているね。


ここでも


オープンモード"w"でファイルを開いているから 


前に


TEN-GOGO-C-language.txtファイルに書き込んだ


Hello!world


は初期化されて消えて


あらたに


10


だけが


TEN-GOGO-C-language.txtファイルにかきこまれ保存されているね。」


🌼

あはは😊


これも順調のようですね。


ソーラーさん

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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