この章ではファイルの取り扱い方法について学習します。
これまではprintf関数などを使って、文字列や計算結果を画面に出力していましたが、その処理が終われば、データは失われてしまいます。
そこで、そのようなデータはファイルに保存しておけば後で確認したい時に便利です。
ではファイルの取り扱いの流れを説明します。
(1) ファイルをオープンします
(2)ファイルの読み書きをします
(3)ファイルをクローズします
では例をみてみましょう。 次にファイルをオープンするのですが、それにはfopen関数を使います。
fopen関数を実行すると、ファイル情報を持つFILE型のポインタ(ファイルポインタといいます)が返されますので、先ほどのファイル構造体の変数に代入します。 以下のようにFILE構造体の宣言とfopen関数の代入を分けて書くこともできます。 「オープンモード」はどのような状態でファイルをオープンするのかをアルファベットで指定します。以下の表を参考にしてください。
この例では”w”を使っていますが、このモードを使うとファイルの中身を上書きして、ファイルがない時は新規作成してくれます。
wモードであればこの例の「net.txt」と言うファイルが自身のフォルダに無くても、自動的に作ってくれます。 fprintf関数はファイルポインタで指定したファイルに変換指定文字を使ってデータを書き込みます。 この例では以下の箇所がfprintf関数の箇所です。 この意味はdouble型のiを変換指定文字の通りにファイルに書き込んでいます。 次に残りのプログラムの説明します。 NULLと言う見慣れない文字がありますが、ファイルが何らかの理由でオープンできなかった時にfopen関数がこのNULLを返します。
「fp ==NULL」はfpがNULLならばを出力してプログラムを終了します。
「exit(1)」はexit関数を使用していますが、引数に1を使用すると異常終了という意味になり、ファイルが開かなかった時はプログラムを終了します。
ファイルが正常に開けば「net.txt」には変数iの値である8.1が入力されます。
次の例ではscanfで読み込んだデータをファイルに書き込みます。 では説明を始めます。 while文の中にEOFという箇所がありますが、これはキーボードでを押すと返される値です(whileの条件式を2行で書いていますが、1行で書いていただいても結構です)。
EOFの前に「!」が付いているので、が押されない間は入力する行為を繰り返すという意味になります。
気を付けることは以下のfprintf関数の変換指定子の箇所に「-6」という箇所がありますが、マイナス指定をするとファイルの中のデータを左詰めにするという意味になります。ファイルに書き込むときには左詰めで入力するのが基本です。 左詰めでファイルにデータを入れているので、「net.txt」は以下のようになります。
次は「net.txt」に書き込んだデータを取り出してみましょう。 ファイルからデータを読み込むにはfscanf関数を使用します。このfscanf関数は書式指定文字に従ってデータを取り出します。 この例でfscanfが使われている箇所は以下です。 ここでもEOFが出てきますが、の意味はファイルの終端までデータを読み込むと言う意味になります。
読み込む時にはfopen関数のオープンモードは「r」になります。
結果は以下の通りです。
次の例ではfputs関数を使ってデータをファイルに書き込む方法について説明します。fputs関数はファイルポインタで指定したファイルへ1行ずつ文字列を出力します。 結果は以下の通りです。 注意点としては以下のように改行を入れないと1行でファイルに書き込まれるので気を付けてください。もちろん、初めから1行で書き込む意図があるのならば改行は入れる必要はありません。 結果は以下の通りです。 次の例は「net.txt」に書き込んだテキストファイルから指定した文字数を読み込むプログラムです。 ファイルから指定した文字を読み込むにはfgets関数が必要です。 fgetsはファイルポインタで指定したファイルから、指定した文字の数だけを読み込んで、配列に代入します。そして、読み取るものが無くなるとNULLを返すので、NULLになったらwhile文を終了します。
読み取るときのオープンモードはを指定してください。 次の例は「net.txt」に書き込んだテキストファイルから1文字ずつ読み込むプログラムです。 fgetc関数はファイルポインタで指定したファイルから1文字読み取ります。 この例では以下の箇所がfgetc関数が使われている箇所です。 ここでは読み込んだ1文字をchar型の変数に入れています。
読み込みに成功すると、その読み込んだ1文字を返し、ファイルの終わりまで読んだ場合は、EOFを返します。ここでは最後にEOFが返された時にループを終了します。
putcharは1文字ずつ出力する機能があります。
カテゴリー