ログイン
kid's world

ファイルからの読み込み

ファイルからの読み込み

次にファイルからの読み込みについて説明しよう。ファイルへ書き込んだときのように,ファイルを開く,ファイルを閉じるという操作はもちろん必要であるが,加えてファイルの終端まで読んだかどうかを知る必要もあることに注意したい。ファイルを書き込むときは,こちら側で書き込みが完了すればファイルを閉じるだけでよかったが,読み込むときはファイルの最後まで達したかどうかを調べながら読み込まなければならない。

ファイルを開く

ファイルを開くとき,fopen関数の第2引数には,”r”を指定する。

fp=fopen("sample.txt", "r");

こうすると,ファイルは読み込み用として開かれる。ファイルが存在しないときはエラーとなり,NULLが返される。

ファイルから読み込む

ファイルからテキストを読み込むときは,fscanf関数が使える。キーボードからデータを入力するのに使ったscanf関数と使い方は同じで,違うのは引数の先頭にファイルポインタを追加することである。エラーが発生した場合の処理なども,すべてscanf関数と同じである。

int fscanf(FILE *stream, const char *format, ...)

もう1つは,fgetc関数である。この関数を使うとファイルから1文字ずつ読むことができる。これはfscanf関数で変換文字として%cを指定した場合と同じであり,空白文字なども1文字ずつ読み取ることができる。

int fgetc(FILE *stream)

引数にはファイルポインタのみを指定する。読み取った文字は,戻り値で得ることができる。

ファイルの終端を知る

キーボードからの入力とは違い,ファイルからデータを読み取る場合は,「終端」というものが存在することに注意しなければならない。ファイルの終端を表す定数としてEOF(end of file)が定義されており,fscanf関数とfgetc関数はファイルの終わりまで読み込んだり,エラーが発生しているときにEOFを返す。

fgetc関数がchar型ではなくint型を返すことに疑問を持った方もいるだろう。実は,これはchar型の範囲外にあるEOFを正しく返すことができるようにするためだ。たとえば,テキストファイルを読み込んで,そのまま表示する例について考えよう。これは,fgetc関数を使って,List 4のように作ることができる。while文の条件式の中でfgetc関数を呼び出して戻り値を変数cに代入し,その値がEOFではない間繰り返す。そのことによってwhile文の中では変数cは常にEOFではないこと,すなわちcには必ず文字が入っていることが保証されるため,何も気にせずにただ変数cの中身を文字として表示すればよいだけになる。文字を一時的に保存している変数cの型がint型であることに注意しよう。繰り返すが,fgetc関数の戻り値の型はint型だからである。

List 4: ファイルの内容を表示する

#include <stdio.h>
#include <stdlib.h>

main()
{
  FILE *fp;
  int c;
  char filename[100];
  
  printf("ファイル名:");
  scanf("%s",filename);
  
  if ((fp=fopen(filename, "r")) == NULL) {
    perror("ファイルが開けません");
    exit(1);
  }
  
  while((c=fgetc(fp)) != EOF)
    printf("%c",c);

  fclose(fp);
}

なお,「printf("%c",c);」の部分は,putchar関数を使って「putchar(c);」と置き換えたほうがよい。文字を1文字だけ表示する場合は,printf関数の代わりにputchar関数を使うと,効率のよいコードが生成される。

(注意:LSI-C86を使っている場合は、ファイル名は8.3形式で扱っているため、たとえば「index.html」は「index~1.htm」などと指定しなければ読み込むことはできない。8.3形式のファイル名は、コマンドプロンプトで「dir /X」と打てば確認することができる。)


バイナリファイルを扱う」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告