I ♥ WordPress

[時間割:C言語]『はじめてのC言語完全入門』その12
2009/01/03 04:22 posted by kunkichi

前回からずいぶん時間が経ってしまっているなぁ、、でも新年の誓いも経てたことだし、心機一転がんばります!
金曜日は「C言語」。ファイル入出力の章からです。

はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
塚越 一雄
技術評論社
売り上げランキング: 420963


  • stdioライブラリのfopen関数を使用する前提とします。
  • fopenはFILE型のポインタを返すので、事前にFILE型のポインタを用意しておくこと。FILE *fp;
    fp = fopen( "sample.txt", "r" );
  • 引数はPerl等と同じく、ファイルとモードを指定する。ただし、モードの指定は、”r”, “w”, “a”, “+”の文字列を使用する。意味は推して計るべし。
  • fopenは失敗した場合に0を返すのでこれを使ってエラーチェックする。
  • ファイルからのデータ読み込みには、ファイルから1文字入力するfgetc関数を使う。fgetcが返すのは、成功した場合は読み込んだ文字を、失敗した場合は-1となる。
  • fgetcの返り値は普通に考えればcharだけどintで受ける。これは
    • charは1バイトのintとして扱える。ただし、その範囲は符号の有無によって変わる。(符号付きの場合は-128〜127、符号なしの場合は0〜255)
    • 全ての文字集合を1バイトで表す場合、成功時は0〜255を返し、-1は失敗を表す。すなわち、-1を表現できる必要がある
    • ところがcharの符号有無は実装に依存する。
    • charがunsignedの場合は、-1を返した場合に10進数では255と区別ができなくなる。
    • charがsignedの場合は、-1を返すことはできるが返せる文字コードの上限が127までとなり、全ての文字集合を表現できない。

    従って、charでは役不足なのでintを使うということ。

  • fgetcはファイルの終わりに達すると-1を返すので、これを使って、fgetcを-1が返るまでループで回せば全データを取得できる。while( (c = fgetc(fp)) != -1 ){
        printf("%c",c);
      }
    また-1の代わりに定数EOFを使ってもよい。
  • ファイルのクローズにはfcloseを使う。引数はファイルポインタのみ。
  • fopen同様、成功時は0、失敗時は1を返す。読み込みだけの場合はfclose時のチェックは不要だけど、書き込みの場合は、チェックした方が良い。

ここまでの内容をサンプルで書くとこんな感じに成りました。単にファイルを開いて出力するだけです。
#include <stdio.h>
 
#define FILENAME "./sample.txt"
 
int main()
{
  FILE *fp;
  
  if( !(fp = fopen( FILENAME, "r" )) ){
    printf("cannot open input file.\n");
    return 255;
  }
  
  int c;
  while( (c = fgetc(fp)) != EOF ){
    printf("%c",c);
  }
 
  if( fclose(fp) ){
    printf("cannot close input file.\n");
    return 255;
  }
  
  return 0;
}

出力時はprintfを使っているけど、putcharとか、他にもあるようです。

とりあえず今日はファイルからの入力まで。次はファイルへの出力をやります。

コメント&トラックバック

トラックバックURL





このページの先頭へ