thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ C/C++へ

ファイル操作(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に近いか遠いかで水準分けして呼ばれている関数が有ります。性能によるものでは有りません。