3 ファイル処理

文字の処理は、なんと言っても、ファイルと密接に関係する。文字データの多くは、キー ボードから、入力するのではなく、ファイルに書かれているの普通である。人間が蓄積し てきた多くの情報は文字で書かれ、現在、大部分のものが電子化、即ち、電子ファイルに 保存されている。そのデータを処理するために、いちいちキーボードから入力したのでは、 日が暮れてしまう。そこで、文字データをファイルから読み込むことが必要になる。ここ では、キーボードからの入力とあわせて、ファイルから文字を入力する方法を学習する。

現代社会において、情報は電子化されなくてはならない。電子化されると多くの媒体で公 表され、世界中の人が使える。私の講義ノートも多くの人に見てもらうために、電子化し ている。インターネットを使って、世界中、どこでも私の講義ノートを見ることができる。 本当に、その技術はすばらしいと思う。ただ、私の講義ノートの善し悪しは別の問題であ る。

3.1 ファイル入力

3.1.1 fgetc

まずは、ファイルから1文字を入力する「fgetc」を紹介する。

fgetc 
機能		ファイルから1文字入力する。
ヘッダー		stdio.h 
形式 		int fgetc(FILE *fp)
返却値 		読み込んだ文字を返す。異常時は EOF を 返す 
読み込み先のファイルは、fgetc関数の実引数に書く。もちろん、これはopen関数により開かれたファイルのファイル記述子である。この関数の動作は、キーボードから1文字入力するgetcharに非常によく似ている。事実、ファイル記述子を「stdin」とすれば、getchar と全く同じ働きをする。stdinとはstandard inputの略で、標準入力すなわち、キーボードのことである。UNIXでは、キーボードもファイルと同じように取り扱われる。この関数は、次のように使う。
   FILE *fp;                    
   int hoge;                    /* 整数型の変数      */
   fp=fopen("text.txt","r");    /* ファイルのオープン */
   hoge=fgetc(fp);              /* 1文字代入         */
この関数は、後で述べる「fputc」と対の関係になっている。

3.1.2 fgets

次にファイルから1行を読み込む関数、fgetsを示す。これは、1行を読み込むが、指定したバイト数を越えるとそこで、読み込みを停止する。

fgets
機能		ファイルから1行読み込み、配列に格納。
ヘッダー		stdio.h 
形式 		char fgets(char *hoge, int n, FILE *fi)
返却値 		入力文字をそのまま返す。ファイル終了時、あるいはエラー のときは NULL を返す。
あらかじめオープンされたファイルから、1行を読み込み、配列hogeに格納する。ただし、nバイト越えると読み込みは止める。この関数は、次のようにして使う。
  FILE *fi;                      
  char hoge[256];                   /* 文字型の配列      */ 
  fi=fopen("rtest.txt","r");        /* ファイルのオープン */
  fgets(hoge,256,fi);               /* 1行代入         */
  fclose(fi);
読み込むバイト数を指定しているため、getsのように、許可されていないメモリー 領域の内容を書き換えるようなことはない。

3.1.3 fscanf

最後のファイル入力は、fscanfである。

fscanf 
機能 		ファイル(fi)から文字列を読み込み、hoge(配列)に格納。
ヘッダー		stdio.h 
形式 		int fscanf(fi,"%s", hoge) 
返却値		通常、入力項目を返す。異常時は EOF を返す。 
この関数は次のように使う。
   FILE *fi;                      
   char hoge[256];                   /* 文字型の配列      */ 
   fi=fopen("rtest.txt","r");        /* ファイルのオープン */
   fscanf(fi,"%s",hoge);            /* 文字列代入         */
   fclose(fi);
この関数も、scanf同様に空白を入力できないという問題がある。理由も 同じである。この関数と対になっているのが、おなじみの「fprintf」 である。

3.2 ファイル出力

ファイル入力に対応したファイル出力の関数である。この関数は、標準出力と非常によく似ている。

3.2.1 fputc

まずは、ファイルに1文字を出力する「fputc」を説明する。

fputc 
機能		ファイルに1文字出力する。
ヘッダー		stdio.h 
形式		int fputc(int hoge, FILE *fo)
返却値		出力した文字を返す。異常時は EOF を返す 
この関数を使って、変数hogeに格納された文字をファイルに出力するためには、次のように記述する。
   FILE *fi,*fo;
   int hoge;                     /* 整数型の変数               */
   fi=fopen("rtest.txt","r");    /* 読み込み用ファイルのオープン */
   fo=fopen("wtest.txt","w");    /* 書き込み用ファイルのオープン */
   hoge=fgetc(fi);               /* 1文字読み込み              */
   fputc(hoge,fo);               /* 1文字書き出し              */
   fclose(fo);                    /* 読み込み用ファイルのオープン */
   fclose(fi);                    /* 書き込み用ファイルのオープン */
fputc」でファイルに文字を書いた場合、改行の「\n」 は出力されない。実際、改行されたら、非常に困る。

3.2.2 fputs

文字列を出力するためには、「fputs」をつかう。

fputs 
機能		ファイルに文字列を出力する。改行は付加しない。
ヘッダー		stdio.h 
形式		int fputs(char *hoge, FILE *fo)
返却値		正常時は非負、異常時は EOF を返す。 
この関数は、つぎのようにつかう。
   FILE *fi,*fo;
   char hoge[256];                /* 文字型の配列               */
   fi=fopen("rtest.txt","r");     /* 読み込み用ファイルのオープン */
   fo=fopen("wtest.txt","w");     /* 書き込み用ファイルのオープン */
   fgets(hoge,256,fi);            /* 1行の読み込み              */
   fputs(hoge,fo);                /* 1行の書き出し              */
   fclose(fo);                    /* 書き込み用ファイルのクローズ */
   fclose(fi);                    /* 読み込み用ファイルのクローズ */
この関数は便利で、最後の文字列の後に、ちゃんとその改行「\n」 が出力される。1行の処理をする関数なので、当たり前である。また、変換処理がないので、printf関数よりも処理が早い。

3.2.3 fprintf

最後は、もう説明する必要がないと思うが、fprintf関数である。

fprintf 
機能		変換書式に従いファイル(fo))に書き出す。
ヘッダー		stdio.h
形式		int fprintf(fo,"%s", hoge)
返却値		正常時は出力されたバイト数を返す。異常時は負の値を返す。 
この関数は次のように使う。
   FILE *fi,*fo;
   char hoge[256];                /* 文字型の配列               */
   fi=fopen("rtest.txt","r");     /* 読み込み用ファイルのオープン */
   fo=fopen("wtest.txt","w");     /* 書き込み用ファイルのオープン */
   fscanf(fi,"%s",hoge);          /* 1文字列の読み込み              */
   fprintf(fo,"%s",hoge);         /* 1文字列の書き出し              */
   fclose(fo);                    /* 書き込み用ファイルのクローズ */
   fclose(fi);                    /* 読み込み用ファイルのクローズ */

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成16年12月25日


no counter