博士「ここをチェックじゃ」

それでは、ファイルの読み込みア~ンド書き込みじゃ。


ぷうさん「?」

・・・なんかぷうさん病が伝染してない?


困った顔の博士

そ、そうかの?
(し、しまった、わしとしたことが!)

ファイル読み込み・書き込みに使用する関数

ファイル、読み込み手順

ファイルを開く「fopen」
fopen(ファイル名,”r”)

  • ” “内はオープンモード(下記参照)
  • ファイルオープン失敗した時は、NULLポインタを返す
ファイルを読む「fgets」
fgets(テキストバッファ,256,ファイルポインタ)

  • ファイルポインタのファイルを文字配列
    テキストバッファへ最大255文字を読み込み
    テキストバッファを返す
  • ファイル終了時(EOFを検出)には、NULLを返す
ファイルを閉じる「fclose」
fclose(ファイルポインタ)

  • ファイルポインタのファイルを閉じ、0を返す
  • 失敗した時は、EOFを返す

ファイル、書き込み手順

ファイルを開く「fopen」
fopen(ファイル名,”w”)

  • ” “内はオープンモード(下記参照)
  • ファイルオープン失敗した時は、NULLポインタを返す
ファイルに書く「fputs」
fputs(テキストバッファ,ファイルポインタ)

  • ファイルポインタのファイルに文字列
    テキストバッファを一行書き出す
  • エラーの場合はEOFを返し、成功した時は、0以上の値を返す
ファイルを閉じる「fclose」
fclose(ファイルポインタ)

ファイルオープンモード

  • r
    テキスト読み込み(ファイルがない場合はオープンエラー)
  • w
    テキスト書き込み、上書き(ファイルがない場合は新規作成)
  • a
    テキスト追加(ファイルがない場合は新規作成)
  • rb
    バイナリファイルとしてrと同じ
  • wb
    バイナリファイルとしてwと同じ
  • ab
    バイナリファイルとしてaと同じ
  • r+
    テキスト読み書き可能で(ファイルがない場合はオープンエラー)
  • w+
    テキスト読み書き、上書き可能(ファイルがない場合は新規作成)
  • a+
    テキスト読み書き可能で追加可能(ファイルがない場合は新規作成)
  • rb+
    バイナリファイルとしてr+と同じ
  • wb+
    バイナリファイルとしてw+と同じ
  • ab+
    バイナリファイルとしてa+と同じ

ファイル処理のプログラムを実行してみよう

博士

説明が終わったところで、ファイルの読み込みと書き込み両方を使ったプログラムをみてみるとしようかの。
入力に関するところと出力に関するところをよ~く見比べるんじゃぞ。


ぷうさん「(^^♪」

はーい☆








ファイルのコピープログラム

#include <stdio.h>
main()
{
   //ファイルポインタの宣言
   FILE *ニュウリョクポインタ, *シュツリョクポインタ;
   char テキストバッファ[256];
   char ニュウリョクファイル[80], シュツリョクファイル[80];

   printf("input filename=");
   //ファイル名の入力
   scanf(%s",ニュウリョクファイル);
   printf("output filename=");
   //ファイル名の入力
   scanf(%s",シュツリョクファイル);

   //ニュウリョクファイルを読み込みモード開け、もし正常に開けなかった場合
   if ( ニュウリョクポインタ=fopen(ニュウリョクファイル,"r")==NULL ) {
      printf("ニュウリョクファイル オープンデキマセンデシタ\n");
      exit(1);
   }

   //シュツリョクファイルを書き込みモード開け、もし正常に開けなかった場合
   if ( シュツリョクポインタ=fopen(シュツリョクファイル,"w")==NULL ) {
      printf("シュツリョクファイル オープンデキマセンデシタ\n");
      exit(1);
   }

   //NULLポインタが変えるまでファイルを読む
   while (fgets(テキストバッファ,256,ニュウリョクポインタ) !=NULL) {
      //NULLポインタが変えるまでファイルを書き込む
      fputs (テキストバッファ, シュツリョクポインタ);
   }
   fclose (ニュウリョクポインタ);
   fclose (シュツリョクポインタ);
}

チェックポイント

困った顔の博士

どうかの、分かるかのぉ・・・(心配じゃ)

exit( )は1が失敗の時、0が成功の時じゃ。
プログラムの終了する関数なんじゃ。
ファイルポインタの宣言を説明し忘れとったが、これを忘れずにな。
FILE *ファイルポインタ宣言するんじゃ。

ぷうさん「怒」

自分が忘れてたのは棚に上げて・・・
・・・・ブツブツ・・・・


博士「×」

なんじゃ?
言いたい事があったら、はっきり言いなされ!


困った顔のぷうさん

Never forget!!
・・・forget-me-notか。
・・・・あれは、悲しい話だよ、ん。


困った顔の博士

ま~た思考がどっかへ飛んどるの・・・。


困った顔のぷうさん

・・・・


博士「ここをチェックじゃ」

ファイルをオープンする時などは、プログラムのようにエラー処理も一緒に覚えておくとよいじゃろう。
欠かせないものなんでな。

fから始まるファイル処理の関数

博士

今まで習った関数に似た関数じゃ。
頭にfをつけると・・・


困った顔のぷうさん

えー、こんがらがりそう…。

ファイルに書き込みの関数「fprintf」

博士「ここをチェックじゃ」

言わばファイルに書き込むprintfじゃな。
機能は一緒なんじゃ。ファイルかディスプレイかの違いじゃな。


ぷうさん「OK」

ファイルの「f」が頭についているとファイルの方ということだね。

fprintf(ファイルポインタ,”%d %s”,配列要素,配列名)

fprintfによるファイルへの書き込みプログラム

博士「Good!」

#defineは、文字列の置き換えを行うんじゃぞ。
覚えておいて損はない変数じゃ。

後から、Nのところにいろいろ数字を置き換えれるんじゃからの。

#include <stdio.h>
main()
{
   FILE *filepnt;
   char text[256];
   char name[N][10]={"tokyo","JP","pu"};
   int basic[N]={100,90,80};
   int cobol[N]={70,60,50};
   int i=0;

   if ( (filepnt=fopen("SEISEKI","w"))==NULL ) {
      printf("file open error\n");
      exit(1);
   }

   for (i0; i<N;i++) {
      fprintf(filepnt,"%s %d %d\n",name[i],basic[i],cobol[i]);
   }
   fclose(filepnt);
}
博士

2行目の「#define N3」はNを3で置き換えろという意味じゃ。
(コンパイルに先立ってNが3に置き換えられる)
この場合、6、7、8行目と16行目が置き換えられるのう。

キーボードからではなくファイルから読み込む関数「fscanf」

博士「ここをチェックじゃ」

それと同じように、scanfと同じ機能を持ったfscanfという関数がある。
こちらはファイルから読み込むんじゃ。

fscanf(ファイルポインタ,”%d %s”,配列要素,配列名)


ぷうさん

ふむふむ。


博士「(^^♪」

二組ともよく似とるじゃろ。


ぷうさん

そーだね~。

fscanfによるファイル読み込みプログラム

博士

ファイルSEISEKIを読み込んでから書きこむぞい。

#include <stdio.h>
main()
{
   FILE *filepnt;
   char text[256];
   char name[10];
   int basic,cobol,total;

   if ( (filepnt=fopen("SEISEKI","r"))==NULL ) {
      printf("file open error\n");
      exit(1);
   }
   printf("[name      ][basic][cobol][total]\n");
   while ( (fscanf(filepnt,"%s %d %d",name,&basic,&cobol))!=EOF ) {
      total=basic+cobol;
      printf("[%-10s][%5d][%5d][%5d]\n",name,basic,cobol,total);
   }
   fclose(filepnt);
}
実行結果
[name      ][basic][cobol][total]
[tokyo     ][  100][   70][  170]
[JP        ][   90][   60][  150]
[pu        ][   80][   50][  130]

オマケ.表示する時に桁を合わせてみる

博士

[%-10s][%5d]の意味は忘れておらんじゃろうな?
随分前にちらっと言っておいたんじゃが・・・。


ぷうさん

ちっちっち!考えがあっま~い!
ちらっと言っただけで覚えてるなんてあるわけ・・


困った顔の博士

やっぱりないかの・・・


ぷうさん「(^^♪」

それがどういうわけか覚えてるんだな、これが。
「-」をつけると左詰めで、この場合だと10桁文字幅を確保って事でしょ?
それで、「-」がついてないのは、右詰め5桁の文字幅確保って事♪


博士「(^^♪」

えっら~いっ!
お前さんとしては、上の上の上出来じゃ!


困った顔のぷうさん

・・・あんまり褒められると返って・・・・・・


困った顔の博士

いや~・・すまん、すまん。
・・・つい本当の事を・・・


ぷうさん「怒」

・・・ジロリ!


困った顔の博士

いや・・・・あはははは・・・


ぷうさん「怒」

ふん!

その三 標準入力と標準出力へ

五日目 ファイル処理について 目次

四日目へ

ぷうさんの七日間戦争 五日目

六日目へ