「C言語」の「ファイル操作の仕組み」とプログラムの書き方を学ぼう!
今回は、「C言語」で「ファイル操作」を行う方法について学んでいきたいと思います。
データの「保存」と「取得」ができるようになると、作成できるアプリケーションの幅も広がりそうです。
それでは、「ファイル操作」の方法について学んでいきましょう。
ファイル操作の方法
「C言語」でファイルを操作するためには、まず「fopen」関数でファイルを開く必要があります。
そして、開いたファイルに「読み込み」や「書き込み」を行い、最後に「ファイルを閉じる」操作を行う必要があります。
「fopen」関数
ファイルを開くためには、「fopen」関数を利用しますが、この関数は、
FILE型のポインタ = fopen("ファイル名","ファイルを開くモード");
のように利用していきます。
「ファイルを開くモードって何?」ってなったので、調べてみました。
まず、「読み込み」を行うためには「r」を指定するそうで、「書き込み」を行うためには、「w」または「a」を指定するとのこと。
「w」は「新規作成」で、「a」は「ファイルへの追記」に利用するそうです。
まず、読み込むデータを用意したいと思います。
今回は「data.txt」というファイルを作り、その中に、
data1 data2 data3
というテキストを作成しました。
このデータを「読み込み」モードで開くプログラムは、
#include <stdio.h> int main(void) { // ファイルを開く FILE *fpointer = fopen("data.txt","r"); return 0; }
のようになります。
もう一つわからなかったのが、「fopen」関数の「戻り値」の「FILE型の変数」の中身です。
これは「FILE構造体」という構造体を表していて、そのポインタを格納するための変数を用意しているそうです。
「開いたファイルにアクセスするための情報」が入っているんですね。
「fclose」関数
「開いたファイル」を利用し終わったら、「ファイルを閉じる」ことが必要です。
「fclose」関数を利用すると、「開いたファイル」を閉じることができます。
使い方は、
fclose(ファイル型構造体のポインタ)
のようになります。
ファイルを開いて閉じるだけの単純なプログラムは、
#include <stdio.h> int main(void) { // ファイルを開く FILE *fpointer = fopen("data.txt","r"); // ファイルを閉じる flose(fpointer); return 0; }
のようになります。
「fgets」関数
ファイルの内容を読み取るためには、「fgets」関数を利用していきます。
この関数は、「ファイル内のデータ」の「1行分」のデータを読み取ってくれます。
通常は「while」文と組み合わせて利用することが多いそう。
「fgets」関数を利用するためには、
fgets(読み込んだデータを格納する変数(文字列型の配列), 読み込むデータの最大文字数, 読み込む対象);
のように書いていきます。
ファイルのデータを読み込んで、データを出力するプログラムを作ってみると、
#include <stdio.h> int main(void) { char data[2048]; // ファイルを開く FILE *fpointer = fopen("data.txt","r"); // ファイルを開けているかを確認 if( fpointer == NULL ){ printf("ファイルが開けません。"); } else { // ファイルの読み込み処理 while( fgets(data, 256, fpointer) != NULL){ printf("%s\n", data); } } fclose(fpointer); return 0; }
のようになります。
「while」文では、「fgets」関数の戻り値が「NULL」かどうかをチェックしています。
「NULL」が返ってきたら「ファイルの最後まで読み込み終了」ということみたいなので、「while」文を抜けるという仕組みなんですね。
なかなか複雑な手順に感じます・・・
「fprintf」関数
ファイルにデータを書き込むためには「fprintf」関数を利用していきます。
「fprintf」関数は、
fprintf(FILE型の変数, 書き込むデータ);
のように書いていきます。
データを追加して、表示するプログラムを作ってみました。
#include <stdio.h> int main(void) { char data[2048]; // ファイルを開く FILE *fpointer = fopen("data.txt","a"); // ファイルを開けているかを確認 if( fpointer == NULL ){ printf("ファイルが開けません。"); } else { // ファイルの書き込み処理(書き込みモード int result = fprintf(fpointer, "data\n"); if( result == -1 ){ printf("ファイルの書き込みに失敗しました。"); } else { fclose(fpointer); // ファイルの読み込み処理 FILE *fpointer = fopen("data.txt","r"); while( fgets(data, 256, fpointer) != NULL){ printf("%s\n", data); } } } fclose(fpointer); return 0; }
のようになります。
「fprintf」関数は、ファイルの書き込みに失敗すると、「-1」が返ってくるのですが、何回も「-1」が返ってきてしまって、プログラムを書くのにハマってしまい、半日くらい悩みました・・・
「読み込みモード」と「書き込みモード」が別なのを忘れてしまい、そのまま「fpointer」関数を利用してしまって、データ表示ができなかったり、ファイルの保存場所が思っていたところと違っていて、ファイルが読み込めなかったりとめっちゃ悩みました。
でも、これで、「データ表示」と「データ書き込み」ができるようになりました。
といっても、まだまだ基本的な機能についてしか学んでいないので、もっといろいろな機能ついて勉強して、ファイルを利用したアプリケーションを作れるようになっていけたらなと思っています。