パソコン活用研究シリコンバレー(C、C++、の活用研究)

ファイル入出力関数

=======================================================================================
ファイル入出力関数として、まずfopen, fclose, putc, fputc, getc, fgetc を取り上げてみましょう。
=======================================================================================

1 ファイルのオープン/クローズ

ファイルのオープン/クローズには、fopen, fclose を使います。
fopen書式は以下の通りですが、mode(アクセスモード)はコンパイラにより異なることがあります。

fopen
【書式】 FILE *fopen(filename, mode);
      char *filename;
      char *mode
返り値 成功の場合は、FILE構造体へのポインタ、失敗(エラー)の場合はNULL 

FILE はstdio.hに定義されているFILE構造体
filename はオープンするファイル名(パスを含む)
mode は以下のものを指定します。
 <アクセスモード>
"r" リードモード 指定したファイルがない場合はエラー。
"w" ライトモード ファイルがない場合は作成される
"a" 追加書き出しモード ファイルがない場合は作成される。ファイルがある場合は、ファイルの最後
   から追加。
"r+" リード/ライトモード。指定したファイルが存在しない場合はエラー
"w+" リード/ライトモード。ファイルがない場合は作成される。
"a+" リード/追加書き出しモード。ファイルがない場合は作成される。ファイルがある場合は、ファイル
    の最後から追加。
 <変換モード>
"t" テキストモード
"b" バイナリモード

例えば、data.binというバイナリーファイルをバイナリーモードでオープンする時は、
FILE *fp;
fp = fopen("data.bin", "rb");
のように記述します。

テキストモードでオープンすると、改行復帰の制御コード(&H0D, &H0A)、終端コード(&H1A)を制御コード
として処理します。

BASICでは書式がさまざまですが、data.txt というファイルを読み込みモードで開く場合は
<F-BASIC> open "I",#1,"data.txt"
<N88BASIC> open "data.txt" for input as #1
のような記述になります。

複数のファイルをオープンする場合、BASICでは#1,#2などの(ファイル番号)で、オープンされたファイルを
識別しますが、C言語では(上記の例では)fp (FILE構造体へのポインタ変数)でどのファイルかを識別します。
BASICプログラマにはFILE構造体というのが、ピンとこないかもしれません。それで最初はとっきにくい感じを
持つかもしれませんが、FILE構造体には、ファイルポインタ(現在読み書きしているデータの位置)や、
ファイルバッファへのポインタといったメンバーが用意されており、ファイルの取り扱いに必要な情報が
保持されています。
FILE構造体については、FILE構造体を参照して下さい。

fcloseの書式は以下の通りです。

fclose
【書式】
int fclose(fp);
FILE *fp;

返り値は、0 クローズ成功   EOF 失敗 


2 バイト入出力
オープンしたファイルに対し、1バイトづつ入出力を行う関数です。

関数 書式 返り値 機能
getc int getc(fp);
FILE *fp;
読み込んだ文字 fpが示す位置(ファイルポインタ)から1文字読み込み、ファイルポインタを
1つ進める。
putc int putc(c,fp);
int c;
FILE *fp
書き出した文字 fpが示す位置(ファイルポインタ)にcを書き出し、ファイルポインタを1つ
進める。

まったく同じ機能の関数としてとして、fgetc,fputcがあります。これらはライブラリ関数なのか、マクロ定義なのか
(getc,putc)の違いですが機能は同じです。ファイルサイズ重視か、実行速度重視かによって使い分けます。
(おじさんのつくる程度のプログラムじゃ関係ないけどね)
簡単な関数なので、使い方は、3 プログラム例を見てください。


3 プログラム例
簡単な例として、ファイルのコピーをするプログラムを作成してみます。
MS-DOSのcopyコマンドと同じ機能(ただし、ワイルドカードは使えないシンプルなもの)です。
>cp file1 file2
でfile1を複製してfile2を作ります。

エラー処理を除くと、最低限必要なのは赤字のところのコードだけです。
いたってシンプルなので、説明不要ですね。

/* cp.c  copy file   For LSIC */

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

main(argc, argv)
int argc;
char **argv;
{ 
  FILE *fp, *fp2;

if(argc != 3) {
 printf("Invarid arguments count");
 exit(0);}

if(NULL == (fp=fopen(argv[1],"rb"))) {
printf("Cannot open File : %s\n",argv[1]);
exit(1);}

fp2=fopen(argv[2], "wb");

while(feof(fp)==0) {
int c;
c=getc(fp);
if(ferror(fp)){
printf(" Read Error \n");
break;}

putc(c,fp2);
if(ferror(fp2)){
printf(" Write Error \n");
break;}
}

fclose(fp);
fclose(fp2);
}





TopPage