I ♥ WordPress

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

火曜日は「C言語」。前回、ファイルからの入出をやったので、今度はファイルへの出力です。

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


  • 書き込み時は、オープンモードを”w”にする。FILE *ofp;
    ofp = fopen("output.txt","w")
  • ファイルへの出力にはfputcを使う。fput(c, ofp);
  • 書き込みの場合はエラー処理が重要。fputcは、EOFに達した場合も書き込みエラーの場合も両方-1を返すので、終了とエラーの区別ができない。よって、エラーが発生していたら真を返すferror関数を使って、「書き込みエラー」を取得する。fputc(c,ofp);
    if(ferror(ofp)){
      printf("書き込みに失敗しました。¥n");
      fclose(ofp);
      return XXX;
    }
    エラーが発生した場合に処理を終了する場合は、ファイルのクローズを忘れないように。
  • 前回のサンプルスクリプトに出力処理を追加。sample.txtを読み込んで、その内容をそのままresult.txtに出力する、いわばcpコマンドのような感じで。#include <stdio.h>
     
    #define INFILE  "./sample.txt"
    #define OUTFILE "./result.txt"
     
    int main()
    {
      FILE *ifp;
      FILE *ofp;
      
      if( !(ifp = fopen( INFILE, "r" )) ){
        printf("cannot open input file.\n");
        return 255;
      }
      
      if( !(ofp = fopen( OUTFILE, "w" )) ){
        printf("cannot open output file.\n");
        return 255;
      }
      
      int c;
      while( (c = fgetc(ifp)) != EOF ){
        fputc(c,ofp);
      }
      
      if(ferror(ofp)){
        printf("書き込みに失敗しました。\n");
        fclose(ofp);
        fclose(ifp);
        remove(OUTFILE);
        return 1;
      }
     
      if( fclose(ofp) ){
        printf("cannot close output file.\n");
        return 255;
      }
      
      if( fclose(ifp) ){
        printf("cannot close input file.\n");
        return 255;
      }
      
      return 0;
    }
  • getcharを使うと、標準入力から1文字読み込むことができる。fgetcと同じように返り値はintで受ける。引数はなし。
  • ferrorってイメージとしてはエラーフラグが立つという感じかな。whileのループの中でなく、ループが終了した後にチェックしているのはそういう意味かと。
  • 上記はferrorで書き込みエラーを拾ったら、出力ファイルポインタをクローズすると共にファイルを削除している。削除にはremove(ファイル名)を使用する。Perlのunlinkみたいなもんかな。
  • fputcは1文字単位なので、ちょっと使いにくい。だけど、fprintfを使えば、printfのように、文字列を特定の書式に当てはめる形で出力することができる。fprintf(ofp,"今日は%d月%d日です。¥n", month, day);引数にファイルポインタを追加する以外はprintfと全く同じ使い方。
  • fprintfを使ったファイル出力のサンプル$ cat fprintf.c
    #include <stdio.h>
     
    #define OUTFILE "result.txt"
     
    int main()
    {
      FILE *ofp;
      if(!(ofp = fopen(OUTFILE,"w"))){
        printf("cannot open outfile.\n");
        return 255;
      }
      
      int num=0;
      printf("数字を入力してください。 ");
      scanf("%d",&num);
     
      fprintf(ofp,"入力された数字は、%d です。\n",num);
      fclose(ofp);
     
      return 0;
    }
    ビルドして実行してみる。$ ./fprintf
    数字を入力してください。 356
    $ cat result.txt
    入力された数字は、356 です。
  • 標準出力、標準エラー出力にも出力できる。それぞれ組み込みのファイルポインタである、stdout、stderr を fprintfの引数にすれば良い。エラーメッセージ等はstderrに出すと良いね。

ということでファイルの出力もできるようになりました。
次は文字列とポインタです。

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

トラックバックURL





このページの先頭へ