ライブラリ関数のfgetsはストリームから一行読み込んで第1引数のバッファに格納する。
SYNOPSIS
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
以下のプログラムはこれを用いて、ファイルをコピーを実装したもの。
/* mycopy */
#include<stdio.h> //printf, perror
#include<stdlib.h> //EXIT_FAILURE, exit
#define BUFSIZE 1024
int main(int argc, char *argv[])
{
FILE *in, *out;
//bufferを用意
char buf[BUFSIZE];
//エラー処理
//コマンドライン引数が2以下の時はエラー
if(argc < 3)
{
fprintf(stderr, "Usage : copy <file1> <file2>\n");
exit(EXIT_FAILURE);
}
//コピー元を読み込みモードで開く
if((in = fopen(argv[2],"r"))==NULL)
{
perror(argv[1]);
exit(EXIT_FAILURE);
}
//コピー先を読み込みモードで開く
//wはファイルが無い場合に新規作成されるモード
if((in = fopen(argv[2],"w"))==NULL)
{
perror(argv[2]);
exit(EXIT_FAILURE);
}
//一行ずつファイルからbufへ読み込む
//文の末尾を示す'\0'出会ったり、BUFSIZE-1だけ読み込む
//BUSIZE-1だけしか読み込まないのは'\0'の文が予め必要だから。
while(fgets(buf, BUFSIZE-1, in) != NULL)
{
//コピー先に書き込む
fputs(buf, out);
}
//コピー元を閉じる
if(EOF == fclose(in))
{
perror(argv[1]);
exit(EXIT_FAILURE);
}
//コピー先を閉じる
if(EOF == fclose(out))
{
perror(argv[2]);
exit(EXIT_FAILURE);
}
return 0;
}
$ gcc -o mycopy mycopy.c
$ ./mycopy
$ ls
mycopy mycopy.c
$ echo "We are the world." > file.in
$ cat file.in
We are the world.
$ ls
file.in mycopy mycopy.c
$ rm file.in
$ ls
mycopy mycopy.c
$ ./mycopy
Usage : copy <file1> <file2>
$ echo "We are the world." > file.in
$ ls
file.in mycopy mycopy.c
$ cat file.in
We are the world.
$ ./mycopy file.in
Usage : copy <file1> <file2>
$ ls
file.in mycopy mycopy.c
$ ./mycopy file.in file.out
$ ls
file.in file.out mycopy mycopy.c
$ cat file.out
We are the world.