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