ファイル操作(fopen,fgets,fputs,feof,fclose)
ファイルのやり取りする関数を使ってみましょう。ファイルを扱うには基本的な作法があります。まず最初にファイルを開く(open)しなければなりません。そして開いたファイルに対して読み込み(read)や書き込み(write)が行えます。またファイルを開く際には、読み込みをするのか、書き込みするのかなど指定しておく必要があります。最後にファイルを閉じ(close)ます。これをしないと他でファイルが開けなくてエラーが発生しますので必ず行いましょう。
今回は例として、テキストファイルのコピーする例です。また高水準関数(*1)を使ってお手軽簡易版コピーです。
■流れ
1. コピー元ファイルを読み込み指定で開きます。
2. コピー先ファイルを書き込み指定で開きます。
3. コピー元ファイルから1行読み込み、データがある間は項4,5を繰り返します。
4. コピー元ファイルから1行づつ読み込みます。
5. コピー先ファイルへ1行づつ書き込みます。
6. コピー元ファイルを閉じます。
7. コピー先ファイルを閉じます。
#include <stdio.h> int main(int argc, char **argv) { FILE *moto;// コピー元用ファイルポインター FILE *saki;// コピー先用ファイルポインター char buf[BUFSIZ];// 読み込み領域 // 1. コピー元ファイル("moto.txt")を読み込み指定("r")で開きます。 moto = fopen("moto.txt","r") ; if ( moto == 0x00 ) { printf("open error moto\n"); return 1; } // 2. コピー先ファイル("saki.txt")を書き込み指定("w")で開きます。 saki = fopen("saki.txt","w") ; if ( saki == 0x00 ) { printf("open error saki\n"); return 1; } // 3. コピー元ファイルから1行読み込み、データがある間は項4,5を繰り返します。 // 4. コピー元ファイルから1行づつ読み込みます。 while( fgets(buf,sizeof(buf),moto) != 0x00 ) { printf("%s",buf); // 5. コピー先ファイルへ1行づつ書き込みます。 fputs(buf,saki); } // 6. コピー元ファイルを閉じます。 fclose(moto); // 7. コピー先ファイルを閉じます。 fclose(saki); return 0; }
■結果
$ cat moto.txt sample1 test_2 line3 $ cat saki.txt cat: saki.txt: そのようなファイルやディレクトリはありません $ gcc main.c $ ./a.out sample1 test_2 line3 $ cat saki.txt sample1 test_2 line3 $ diff moto.txt saki.txt $
(*1):関数にはOSに近いか遠いかで水準分けして呼ばれている関数が有ります。性能によるものでは有りません。