ファイルに書き込む
プログラムが終わると成績は消える
ここまでの成績管理CLI は、実行するたびに名前と点数を打ち直していました。変数も配列も構造体もメモリの上にあるだけなので、main が終わればすべて消えます。次に起動したときも成績が残っているようにするには、ファイル に書き出すしかありません。
ファイルを開く
ファイルを扱う手順は、開く・読み書きする・閉じる、の 3 段階です。開くのは fopen です。
FILE *fp;
fp = fopen("scores.txt", "w");FILE * は「開いているファイルを表す情報の住所」を入れる型です。中身が何かを知らなくても、fopen が返したものを持ち回れば使えます。ポインタなのは、この情報が大きいので毎回コピーせず住所でやりとりするためです。
2 つ目の引数はモードで、書き込みなら "w" です。"w" には強い性質があります。同じ名前のファイルが既にあると 中身を全部消してから 開きます。追記したいときは "a"、読むだけなら "r" を使います。
printf のファイル版
書き込みには fprintf を使います。printf の先頭に、書き込み先の fp を足しただけです。
fprintf(fp, "%s %d\n", list[i].name, list[i].score);書式の書き方も \n の意味も printf とまったく同じです。違うのは、出た文字が画面ではなくファイルに流れることだけです。
名前と点数の間に空白を入れ、1 人 1 行にしておくのがコツです。この形にしておくと、次回このファイルを読み戻すのが楽になります。
閉じるまでが書き込み
最後に fclose(fp); を呼びます。これは礼儀ではなく必須です。書き込んだ内容はいったん手元のバッファにためられていて、fclose のタイミングでまとめてファイルに送られます。閉じずに終わると、途中までしか書かれていないファイルが残ることがあります。
なお、fopen で開けるファイルの数には上限があります。閉じずに開き続けると、いつか開けなくなります。開いたら閉じる、を対にして書く癖をつけてください。
書けたことをその場で確かめる
書き込みは、うまくいっても画面には何も出ません。だから「たぶん書けたはず」で先に進んでしまいがちで、実際にはファイル名を間違えていた、fclose を忘れていた、ということが起こります。
そこで今回は、書いたあと同じプログラムの中で "r" で開き直し、fgets で 1 行ずつ読んで画面に出す部分を用意してあります。fgets は行を切り分けずに文字列としてそのまま取ってくる関数で、読めた行があるうちは行の中身を、ファイルの終わりに来たら NULL を返します。書いた直後に読み返せば、思ったとおりの形で保存できたかがその場で分かります。
要件
- scores.txt を書き込みモードで開く
- fprintf で「田中 82」の形を1人1行ずつ書き出す
- 書き終えたら fclose で閉じる
- 読み直した結果の前に「保存した内容」の行が出ること
入出力例
main("田中 82", "佐藤 90") → "保存した内容
田中 82
佐藤 90"
main("鈴木 71", "高橋 68") → "保存した内容
鈴木 71
高橋 68"