プログラム勉強―進捗03 | 風はぐるぐる 横寄

風はぐるぐる 横寄

女装を世の中に広め、男性のファッションとして定着させる!
”女装の伝道師”toメイドのブログ
Unity、RPGツクールMV、RPGツクールMZを使用したゲーム制作もしています。

勢いは衰えず、まだ続いているC言語の勉強。
「作ろうとしているツール」に必要はコードはまだまだある。

今回は、ファイル操作をやってみた。
ツール系のアプリケーションではなくてはならない機能の一つ、データの入出力。

今回の記事は、あとから全然違う(?)関数を使い始めますw
 
 
以前の記事では記述したコードによって日付や時間などのデータを取得し、変数を使用して画面上に出力する……ということをやった。
今回はその出力した文字列をファイルに書き出してみた。
 
今回のコードの記述も、名前は忘れたけど他のサイト様の記事を参考にさせて頂いている。
fopen関数を使うと例のセキュリティ上の問題なのか、エラーが発生するので、fopen_s関数を使用してファイルをオープンしている。
 
 
 
 

書き出しました……ということは、エラーがなく正常に進めたということか。
本当に書き出せたのか確かめてみる。
 
 
 
 
 
 
ほんとに書き出せてた。
出力は成功……と、ここまではよかった。

 
書き出した文字列を、今度は読み出す時から問題が発生した。
 
 
 
そのまま丸ごと読み出すだけなら、逆のコードを記述すればできる。
が、この文字列の「一部だけ」……「数字だけ」とかとなると、ちょっと扱い方が変わってくる。
というか、全て端折って結論だけいうと「コードが長くなる」。
「ややこしくなる」というのもある。
 
ということで、いつもの如く(?)他の関数を探すことになるんだけども。
 
 
ふと思い出したのが”ゲームのセーブデータ”。
あれはどうやって出力しているんだろう。
そう思ってC言語のセーブデータ作成について調べると、あるサイト様のページを見つけた。

実は、このサイト様は以前にもアクセスしたことがあって。
生半可な知識のままで「ゲームを作ろう」なぞと考えていたため、(失礼? なことではありますが)書かれてることがよくわからなくて投げた内容でもあるw

今回は、ある程度の知識があったからなのか、ちゃんと書かれてることが分かった。
「出力するデータをバイナリデータとして扱えば、読み書きが比較的簡単に行える」という。
おまけに、構造体を作って一括でデータを扱えばわかりやすくなるとも。
サンプルに沿って記述してみる。
 
 
 
 
構造体”status”を宣言し、name, hp, maxhp, mp、と4つの変数を持たせる。
この変数それぞれに、4つの内容を格納する。

……余談だけど。
「トゥーム=エディアン」というのは、以前から描いてる看板キャラのフルネームw
これをfwrite関数を使用して、save.txtというファイル名で書き出す。
(バイナリファイルを扱うときはこの関数を使用するらしい)

後に書き出す内容を画面にも出力。
(今回ファイルに出力するのは、名前と数字のデータのみ。文字列を丸ごと出力するわけではありません)
 
 
 
出力した限りではちゃんと設定できている。
実際に開いてみるとどうなっているか。
 
 
 
 
 
 
トゥーム=エディアン フフフネ ネ d だってw
……これは、バイナリ形式で出力されているからで、このおかしな文字列になるのは問題ないらしい。

となると、最初の「トゥーム=エディアン」は丸わかりということになるw
なんか対策しないとだ。
 
 
 
 
 
今度は、この出力したファイルを読み込んでみる。
モードを読み込み(rb)に変え、fwrite関数をfread関数に変える。
引数は全く変える必要はない。お手軽。
 
 
 
 
 

出力したときと同じように、読み込んだ結果がちゃんと表示された。
 
これで一通りの処理のやり方が分かったことになる。
 
 

ここからは、自分がこの一連の処理を記述してた時につまずいた部分や忘れがちなこと、便利だと思った部分を書いていく。

・構造体は複数作ってファイルに出力できる
当たり前といえばそうなのかもだけど……。
 
 
 

今回のは構造体は1つでやったけど、複数作っても対応できるみたいで。
変数を2つ使って順番に出力したらちゃんと出力できた。
 
 
 
 
下にもう一つ同じようにデータを作り、出力した後また読み込んでみた。
この時、出力したデータはすべて横に延々と並ぶ形になっている。
注意するべきところは、この出力したデータは単純に並んでいるだけなので、読み込みの時には出力したときの順番で読み込むようにしないと、データがズレてしまう。
 
 
・ファイルをオープンするときのモードと、読み込み・出力の関係を間違えて記述するとエラーになる。
これも当たり前といえばそうかもしれないんだけど。
モードを出力(wb)にしているのにwread関数を記述したり、その逆をやってしまったりするとエラーになる。
出力した後に読み込みをやったとき、関数はfreadに変えたけどモードをwbのままで起動してしまったので。
この場合は、fclose関数のところでエラーになるか、-8560356……のような、よく分からない数値になったりする。
 

・ファイル操作系の処理について
ファイルのモードを出力(wb)でオープンする度に、新しいファイルで上書きされる。
……ファイルをオープンした瞬間から上書きは始まっているので、万が一ファイルをオープンした直後にエラーが発生してしまうと、今までに保存したデータが全て消えてしまうようなことになりかねない。
ある種、細心の注意を払って使わないといけない関数群かもしれない。
 
 

……みたいなことで、まだまだ知るべき関数はあるので、勢いは緩められない。
むしろ、もっと勢いつけていかないと、とか言ったりしてw