Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - 入出力ライブラリ」です。

C言語プログラミング入門

14. ライブラリ関数(4/36) - 入出力ライブラリ(3/10)

14.3 文字の入力関数

14.3.1 fgetc関数、getc関数

fgetc関数とgetc関数は関数名が異なるだけで機能および、形式は同じです。ただし、C言語の処理系により異なりますが、getc関数は関数ではなくマクロで実装されている可能性が有ります。

これらの関数はファイルポインタに対応したファイルから1文字を入力して返り値として返します。返り値の型名はchar型ではなくint型ですので注意してください。(char型は整数型(short型やint型、等)の一種ですので、char型からint型への変換は可能です。従って、文字をint型として取り扱っても問題有りません)

【表14-1-7】 fgetc関数、getc関数
形式#include <stdio.h>
int fgetc(FILE *fp);
int getc(FILE *fp);
返り値入力できた場合は入力した1文字を返します。ファイルの終端やエラーを検出した場合はEOFを返します。
引数
FILE *fp
入力するファイルのファイルポインタを指定します。
使用法、
返り値がEOFの場合は厳密にはファイルの終端かエラーか分かりませんので、必要に応じて、feof関数ferror関数でチェックを行います。

14.3.2 getchar関数

getchar関数は標準入力から1文字を入力します。従って、int fgetc(stdin);int getc(stdin);と同じです。

【表14-1-8】 getchar関数
形式#include <stdio.h>
int getchar(void);
返り値fgetc関数、getc関数と同じです。
引数 なし。

14.3.3 ungetc関数

ungetc関数は文字を再度入力できるように入力ストリームに戻します。戻せる文字は1文字のみです。

【表14-1-9】 ungetc関数
形式#include <stdio.h>
int ungetc(int c, FILE *fp);
返り値正常に戻せた場合は第1引数の値を返し、出来なかった場合はEOFを返します。
引数
int c
入力ストリームに戻す文字を指定します。
FILE *fp
文字を戻す入力ストリームのファイルポインタを指定します。

14.3.4 例題

実行時引数で指定したファイルの内容を標準出力に出力します。(catコマンドと同じような機能です)

  1. #include <stdio.h>
  2. int main(int argc, char **argv)
  3. {
  4.     FILE    *fp;
  5.     int     one_char;
  6.     int     return_code = 0;
  7.  
  8.     if(argc == 2)
  9.     {
  10.         if((fp = fopen(*(argv + 1), "r")) != NULL)
  11.         {
  12.             /* オープン成功。ファイルから1文字ずつ入力 */
  13.             while((one_char = fgetc(fp)) != EOF)
  14.             {
  15.                 printf("%c", (char)one_char);
  16.             }
  17.  
  18.             if(fclose(fp) != 0)
  19.             {
  20.                 /* クローズ失敗 */
  21.                 printf("%sファイルのクローズは失敗しました。\n", *(argv + 1));
  22.                 return_code = 1;
  23.             }
  24.         }
  25.         else
  26.         {
  27.             /* オープン失敗 */
  28.             printf("%sファイルのオープンは失敗しました。\n", *(argv + 1));
  29.             return_code = 1;
  30.         }
  31.     }
  32.     else
  33.     {
  34.         /* 実行時引数が不当 */
  35.         printf("実行時引数が不当です。\n");
  36.         return_code = 2;
  37.     }
  38.  
  39.     return return_code;
  40. }
$ cat /etc/issue ← catコマンドで/etc/issueファイルの内容を確認します
Fedora release 8 (Werewolf)
Kernel \r on an \m

$ ./ex14_1_2.prg /etc/issue ← 実行時引数に/etc/issueを指定して実行します
Fedora release 8 (Werewolf)
Kernel \r on an \m

$
10行目
fopen関数で実行時引数に指定されたファイルをオープンします。
13行目
while文の繰り返しの中でfgetc関数で1文字入力します。fgetc関数の返り値がEOFでない間、繰り返します。ここではfgetc関数を使っていますが、getc関数を使っても同じです。
15行目
fgetc関数で入力した1文字をprintf関数で出力しますが、出力するのは文字ですので書式は%cです。変数one_charはint型ですので、ここでは明示的にchar型に変換していますが、変換を指定しなくても構いません。(char型は整数型の一種ですので、自動的に変換されます)

14.4 文字の出力関数

14.4.1 fputc関数、putc関数

fputc関数とputc関数は関数名が異なるだけで機能及び、形式は同じです。ただし、C言語の処理系により異なりますが、putc関数は関数ではなくマクロで実装されている可能性が有ります。

これらの関数はファイルポインタに対応したファイルに1文字出力します。

【表14-1-10】 fputc関数、putc関数
形式#include <stdio.h>
int fputc(int c, FILE *fp);
int putc(int c, FILE *fp);
返り値出力できた場合は出力した1文字を返します。エラーを検出した場合はEOFを返します。
引数
int c
出力する1文字を指定します。型名はint型ですので注意してください。
FILE *fp
出力するファイルのファイルポインタを指定します。

14.4.2 putchar関数

putchar関数は標準出力に1文字出力します。従って、int fputc(c, stdout);int putc(c, stdout);と同じです。

【表14-1-11】 putchar関数
形式#include <stdio.h>
int putchar(int c);
返り値fputc関数、putc関数と同じです。
引数 出力する1文字を指定します。

14.4.3 例題

実行時引数として2つのファイルパス名を指定してファイルのコピーを行います。(cpコマンドと同じような機能です)なお、ソースファイルの行数を少なくしてプログラムのポイントを明確にするため、エラー処理は省略しています。

  1. #include <stdio.h>
  2. int main(int argc, char **argv)
  3. {
  4.     FILE    *fp_src;    /* コピー元ファイル */
  5.     FILE    *fp_dest;    /* コピー先ファイル */
  6.     int     one_char;
  7.  
  8.     fp_src = fopen(*(argv + 1), "r");
  9.     fp_dest = fopen(*(argv + 2), "w");
  10.  
  11.     while((one_char = fgetc(fp_src)) != EOF)
  12.     {
  13.         fputc(one_char, fp_dest);
  14.     }
  15.  
  16.     fclose(fp_dest);
  17.     fclose(fp_src);
  18.  
  19.     return 0;
  20. }
$ ls ./temp.txt ← ./temp.txtファイルの有無を確認します
ls: cannot access ./temp.txt: そのようなファイルやディレクトリはありません
$
$ ./ex14_1_3.prg /etc/issue ./temp.txt ← 実行時引数に/etc/issueと./temp.txtを指定して実行します
$
$ cat ./temp.txt ← ./temp.txtファイルの内容を確認します
Fedora release 8 (Werewolf)
Kernel \r on an \m

$
13行目
while文の繰り返しの中でfgetc関数で1文字入力し、それをfputc関数で出力します。ここではfputc関数を使っていますが、putc関数を使っても同じです。

14.5 行の入力関数

14.5.1 fgets関数

fgets関数はファイルポインタに対応したファイルから指定した長さの文字列または、1行分の文字列を入力します。

【表14-1-12】 fgets関数
形式#include <stdio.h>
char *fgets(char *buff, int size, FILE *fp);
返り値入力できた場合は第1引数のbuffの値(buffの先頭アドレス)を返します。エラーを検出した場合または、何も入力しないでファイルの終端を検出した場合はNULLを返します。
引数
char *buff
入力した文字列を格納する領域を指定します。入力したデータの最後にはヌル文字('\0')が付加されて文字列になっています。
int size
入力する文字列の最大文字数を指定します。この関数は1行の文字数がsizeよりも少ない場合は1行全体を入力し、多い場合はsize分の文字を入力します。ただし、最後にヌル文字が付加されるため、実際に入力する文字数はsize - 1になります。
FILE *fp
入力するファイルのファイルポインタを指定します。
使用法、
返り値がNULLの場合は厳密にはファイルの終端かエラーか分かりませんので、必要に応じて、feof関数ferror関数でチェックを行います。

14.5.2 gets関数

gets関数は標準入力から1行分の文字列を入力します。この関数は第1引数に指定したバッファに入りきらない容量の文字列も入力してしまいます。従って、セキュリティ上、大変危険ですので、なるべく使わない方がよいでしょう。

【表14-1-13】 gets関数
形式#include <stdio.h>
char *gets(char *buff);
返り値fgets関数と同じです。
引数
char *buff
入力した文字列を格納する領域を指定します。入力したデータ中の改行文字やEOFはヌル文字('\0')に置き換えられます。

14.5.3 例題

実行時引数で指定したファイルの内容を標準出力に出力します。(catコマンドと同じような機能です)なお、ソースファイルの行数を少なくしてプログラムのポイントを明確にするため、エラー処理は省略しています。

  1. #include <stdio.h>
  2. #define SIZE 4096
  3.  
  4. int main(int argc, char **argv)
  5. {
  6.     FILE    *fp;
  7.     char    buff[SIZE];
  8.  
  9.     fp = fopen(*(argv + 1), "r");
  10.  
  11.     while(fgets(buff, SIZE, fp) != NULL)
  12.     {
  13.         printf("%s", buff);
  14.     }
  15.  
  16.     fclose(fp);
  17.  
  18.     return 0;
  19. }
$ ./ex14_1_4.prg /etc/issue ← 実行時引数に/etc/issueを指定して実行します
Fedora release 8 (Werewolf)
Kernel \r on an \m

$
2行目
fgets関数で入力する文字列の最大文字数を、SIZEという名称のマクロとして定義します。
7行目
fgets関数で入力したデータを格納するchar型の配列を宣言します。要素数は2行目で定義したマクロ(SIZE)を指定していますので、実際は4096です。
11行目
while文の繰り返しの中でfgets関数で文字列を入力します。
13行目
入力した文字列をprintf関数で出力します。配列buffに格納されているデータの最後には、ヌル文字('\0')が付加されて文字列になっていますので%s書式を指定します。

14.6 行の出力関数

14.6.1 fputs関数

fputs関数はファイルポインタに対応したファイルに文字列を出力します。

【表14-1-14】 fputs関数
形式#include <stdio.h>
int fputs(const char *buff, FILE *fp);
返り値正常に出力できた場合はEOF以外(0以上の値)を返します。エラーを検出した場合はEOFを返します。
引数
const char *buff
出力する文字列を指定します。文字列の最後のヌル文字('\0')は出力しません。
FILE *fp
出力するファイルのファイルポインタを指定します。

14.6.2 puts関数

puts関数は標準出力に1行分の文字列を出力します。なお、文字列の最後のヌル文字を改行文字に置き換えて出力しますので注意してください。

【表14-1-15】 puts関数
形式#include <stdio.h>
int puts(const char *buff);
返り値fputs関数と同じです。
引数
char *buff
出力する文字列を指定します。文字列の最後のヌル文字('\0')は出力しません。また、文字列の最後に改行文字を付加します。

14.6.3 例題

fgetc関数とfputc関数の例題と同じく、実行時引数として2つのファイルパス名を指定して、ファイルのコピーを行います。なお、ソースファイルの行数を少なくしてプログラムのポイントを明確にするため、エラー処理は省略しています。

  1. #include <stdio.h>
  2. #define SIZE 4096
  3.  
  4. int main(int argc, char **argv)
  5. {
  6.     FILE    *fp_src;    /* コピー元ファイル */
  7.     FILE    *fp_dest;   /* コピー先ファイル */
  8.     char    buff[SIZE];
  9.  
  10.     fp_src = fopen(*(argv + 1), "r");
  11.     fp_dest = fopen(*(argv + 2), "w");
  12.  
  13.     while(fgets(buff, SIZE, fp_src) != NULL)
  14.     {
  15.         fputs(buff, fp_dest);
  16.     }
  17.  
  18.     fclose(fp_dest);
  19.     fclose(fp_src);
  20.  
  21.     return 0;
  22. }
$ ls ./temp.txt
ls: cannot access ./temp.txt: そのようなファイルやディレクトリはありません
$
$ ./ex14_1_5.prg /etc/issue ./temp.txt
$ cat ./temp.txt
Fedora release 8 (Werewolf)
Kernel \r on an \m

$
15行目
13行目のfgets関数で入力した文字列をfputs関数で出力します。