ライブラリ関数fgetsを用いてファイルから一行ずつ文を読み込む



ライブラリ関数の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.