[C言語]ファイル操作関数で読み書きの関数の作成[コード付]

C言語

どうもシュモクザメです。
今回は僕の記事でかなりの頻度で現れるファイルの読み書き関数の紹介をしていこうと思います。

具体的には主なファイル操作の標準関数である

  • fopen
  • fclose
  • fscanf
  • fprintf

をファイル読み書き関数の中での使われ方を確認しながら紹介していきます。

ファイルの読み出し関数

とりあえずファイルを読み込むことができる関数のコード

#define NAME 64//ファイル名の長さの上限です。64に特に意味はありません

void SCAN(int N, int x[N],char filename[NAME]){ //読み込み用関数
    FILE *fp;
    int i;
    if((fp=fopen(filename,"r"))==NULL){
        printf("ファイルを読み込めません\n");
    }else{
        for(i=0; i<N; i++){
            fscanf(fp,"%lf",&x[i]);
        }
    }
    fclose(fp);
}

このコードを分解して説明していきます。

FILE型ポインタ

FILE *fp;

これはFILE型というファイルを扱うときの型のポインタをfpという名前で宣言しています。
ここから先のファイル操作ではこのfpでファイルを指して操作していきます。
とりあえずintとかdoubleみたいなものだと思っときましょう。

fopenの”r”モード

if((fp=fopen(filename,”r”))==NULL){
printf(“ファイルを読み込めません\n”);

}

????????

急にややこしくなりましたね。
一旦fopenの仮引数について考えましょう。

fopenの第一引数には操作するファイル名を渡します。
上のコードの場合char型配列filenameに操作するファイル名(x.txtやabc.rtxなど)を格納して渡しています。

そしてfopenの第二引数には操作するモードを渡します。
モードっていうのは

  • 読み出し
  • 書きこむだけ
  • 読みだすし、書き込むし
引数制限
“r”読み出しだけ可能
“w”書き込みだけ可能
“a”追加で書き込むことだけ可能

など使い勝手によって選択します。
今回は読み出すので読み出しのモード、つまり”r”を渡しています。

そしてfopenは指定したモードで開いた、指定したファイルを指すポインタを返してくれます。
もし指定したファイルが存在しなければNULLを返します。

つまり上のコードのif文の式は
filenameという名前のファイルが存在しなければ、
printfでファイルが存在しませんと表示する

存在していれば、
“r”モードで開いてelseの処理に移る

という意味です

仮にfopenでファイルを開けたとしても、
具体的にファイルを指すポインタってどういうこと?


fopenでファイルを開いてポインタを渡すとは、
具体的にはそのファイル内の先頭の文の塊を指すポインタを渡すということです。
文の塊とは文章を改行や空白で区切ったものです

fscanf

else{
for(i=0; i<N; i++){
fscanf(fp,”%d”,&x[i]);
}

scanfに似ているけど引数が一個多いですね

まずscanfで考えましょう。
scanf(“%d”,&x); のときは
標準入力(キーボードからの打ち込み)で入力した
値(この場合は”%d”よりint型)を
変数xに代入する。という意味ですね


それがfscanf(fp,”%d”,&x);のときは
ファイル(現在fpが指している文節)の
値(この場合は”%d”よりint型)を
変数xに代入する。という意味になります。


つまり

だけの違いです。

またfscanfは一度使うたびにポインタを一つ先に進めるという機能があります。
具体的にはこのようにポインタを次の文節へと進めていきます

つまり上のコードの場合は先頭からN個の文節をfor文を用いて読み取るということになります。

fcolse

fclose(fp);

これはfopenを使った際に必要な関数です。
なぜ必要かというとfopenを使うときにメモリ領域を使用するのですが、fcloseを使わないとメモリを解放できません。
メモリやらなんやらの話をするとややこしくて趣旨が変わってきてしまうので今回は割愛。
とりあえず

開けたら(fopen)
閉める(fclose)


これで読み込み関数は完成ですね。

書き込み関数

#define NAME 64//ファイル名の長さの上限です。64に特に意味はありません

void WRITE(int N, int x[N],char filename[NAME]){ //書き込み用関数
    FILE *fp;
    int i;
    if((fp=fopen(filename,"w"))==NULL)
        printf("ファイルに書き込めません\n");
    else{
        for(i=0; i<N; i++){
            fprintf(fp,"%d\n",x[i]);
        }
    }
    fclose(fp);
}

基本的にfopenとfprintf以外は読み込み用のものとおなじですね。

fopenの”w”モード

if((fp=fopen(filename,”r”))==NULL){
  printf(“ファイルを読み込めません\n”);

}


今回はファイルに書き込むので”w”モードでfopen関数を使用します。

fprintf

else{
for(i=0; i<N; i++){
fprintf(fp,”%d”,x[i]);
}


これもfscanfの時と同じようにprintfと比較して考えます。

printf(“%d”,x); のときは
“”で囲った文章や値を
標準出力(画面に表示)する


それがfscanf(fp,”%d”,&x);のときは

“”で囲った文章や値を
ファイル出力する(開いているファイルのポインタの指している部分に書き込む)
という意味になります。

fcloseも同様に使って書き込み関数も完成です。

おわり

他にもファイル操作でえ色々できるのですが、最低限上の二つの関数があれば適宜いじったりして、大学の課題とかなら対応できると思います。

また以下の記事ではXcodeを使っている人向けのファイル操作について書いているのでそちらもどうぞ。ではまた〜

コメント

タイトルとURLをコピーしました