|
パソコン活用研究シリコンバレー(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
|