C言語には、ファイルから1文字を入力するための関数としてgetc()関数とfgetc()関数が、
出力するための関数としてputc()関数とfputc()関数が用意されています。
今回のC言語超入門では、サンプルプログラムを使いながら、
ファイルから文字を入出力する方法について解説いたします。
なお、ファイルのオープン・クローズについてはC言語超入門(第39回)、ファイルから文字列を入出力する方法については C言語超入門(第41回)を参照くださいませ。

二つの文字入出力関数

ファイルから1文字を入力するための関数は、getc()関数とfgetc()関数の二つがありますが、両者は同じです。
ただ、getc()はマクロ形式で提供されているため、fgetc()よりもプログラムの実行速度が速くなるというメリットがありますから、
特別な事情が無い限り、getc()の利用をお勧めします。
なお、ファイルに1文字を出力するための関数もputc()関数とfputc()関数の二つがあり、
同様にputc()の方が高速に動作します。

文字をファイルから1文字ずつ入力してファイルに1文字ずつ出力するサンプルプログラム

/* プログラム1 */
#include <stdio.h>
int main(void){
    FILE *fpi, *fpo;
    int moji;
    /* <成功例> */
    if((fpi=fopen("file_in.txt","r"))==NULL) printf("file_in.txtファイルのオープンに失敗");
    else {
        if((fpo=fopen("file_out.txt","w"))==NULL) printf("file_out.txtファイルのオープンに失敗");
        else {
            while(moji=getc(fpi)!=EOF) putc(moji,fpo);
            fclose(fpo);
        }
        fclose(fpi);
    }
    /* <失敗例> */
    if((fpi=fopen("file_in_1.txt","r"))==NULL) printf("file_in_1.txtファイルのオープンに失敗");
    else {
        if((fpo=fopen("file_out_1.txt","w"))==NULL) printf("file_out_1.txtファイルのオープンに失敗");
        else {
            while(moji=getc(fpi)!=EOF) putc(moji,fpo);
            fclose(fpo);
        }
        fclose(fpi);
    }
}

※事前に準備するファイル(file_in.txt)の内容
こんにちは。
私の名前はKyokoです。
C言語を勉強しています。
上記のプログラム1を実行しますと、ディスプレーには以下のようにメッセージが表示され、
file_out.txt ファイルが新規に作成されます。
※プログラム1を実行した際にディスプレーに表示されるメッセージ
file1_in_1.txtファイルのオープンに失敗
※プログラム1を実行した際に作成される file_out.txt ファイルの内容
こんにちは。
私の名前はKyokoです。
C言語を勉強しています。

サンプルプログラムの解説

上記プログラム1はfopen()関数を使い、8行目で文字を入力するファイルをオープンし、
10行目で文字を出力するファイルをオープンしています。
ここで注目したいのが、fopen()関数の引数です。
8行目のfopen()関数は、入力用のためオープンモードが ”r” で、一方10行目は出力用のファイルをオープンするため、オープンモードを “w” にしています。
(参考:【C言語超入門(第39回)】ファイルからの入出力の方法を学ぼう(オープン、クローズ編))
なお、プログラム1の19行目のfopen()関数では、わざと存在しないファイルをオープンしています。
fopen()関数はファイルのオープンに失敗するとNULLを返す仕様を利用して、
関数の戻り値がNULLならエラーメッセージを出力して以降の処理をスキップしていることが、
プログラムの実行結果から分かると思います。
プログラム1の12行目では、getc()で file_in.txt ファイルから文字を入力し、
そのままputc()で file_out.txt に出力をしています。
getc()は、ファイルの終端を読み取るとEOFを返す使用を利用して、
while文を使ってgetc()がEOFを返すまで繰り返しています。
つまりプログラム1は、file_in.txt を file_out.txt にコピーするプログラム、という訳です。
コンピューターを使っているとき、ファイルをコピーすることがありますよね。
実は普段、何気なく使っているファイルのコピーというのは、
プログラム1のようなプログラムがコンピューター上で実行されているのです。

C言語超入門の第40回まとめ

さて今回のC言語超入門では、ファイルから入出力する方法のうち、
ファイルから1文字を入出力する処理について解説してきましたが、いかがでしたでしょうか。
もう一度、ファイルから1文字を入出力する処理のポイントを整理して締めくくりたいと思います。
・ ファイルから1文字を入力するための関数としてgetc()関数とfgetc()関数が、出力する関数としてputc()関数とfputc()関数がある
・ getc()、putc()の方が高速に動作する
なお、ファイルのオープン・クローズについてはC言語超入門(第39回)、ファイルから文字列を入出力する方法については C言語超入門(第41回)を参照くださいませ。
ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。