C言語ファイルの読み書き


詳細
 
                。 C               :
            :fgetc fputc
           :fgets fputs
           :freed fwrite
           :fscanf fprinf


それぞれご紹介します.以上の関数を使用するには、ヘッダファイルstdioを含める必要がある.h.
 
文字読み書き関数fgetcとfputc
文字読み書き関数は、文字(バイト)単位の読み書き関数です.ファイルから読み出されるたびに、またはファイルに1文字ずつ書き込むことができます.
1)文字関数を読み取るfgetc fgetc関数の機能は、指定したファイルから文字を読み取ることであり、関数呼び出しの形式は、文字変数=fgetc(ファイルポインタ)である.例えば、ch=fgetc(fp);開いたファイルfpから1文字を読み出しchに送ることを意味する.fgetc関数の使用については、次の点を説明します.
fgetc関数呼び出しでは、読み込まれたファイルを読み取りまたは読み書きで開く必要があります.
文字を読み込んだ結果は、文字変数に値を割り当てなくてもよい.例えば、fgetc(fp);ただし、読み出した文字は保存できません.
ファイル内に位置ポインタがあります.ファイルの現在の読み書きバイトを指します.ファイルが開くと、ポインタは常にファイルの最初のバイトを指します.fgetc関数を使用すると、位置ポインタは1バイト後方に移動します.したがって、fgetc関数を連続的に複数回使用して、複数の文字を読み取ることができます.ファイルポインタとファイル内部の位置ポインタは同じではないことに注意してください.ファイルポインタはファイル全体を指し、プログラムで説明を定義する必要があります.値を再割り当てしない限り、ファイルポインタの値は変わりません.ファイル内部の位置ポインタは、ファイル内部の現在の読み書き位置を示すために使用され、読み書きごとにポインタが後方に移動し、プログラムで説明を定義する必要はなく、システムによって自動的に設定されます.
【例13−1】ファイルc 1.docを読み込み、画面に出力する.
 
#include
main(){
    FILE *fp;
    char ch;
    if((fp=fopen("d:\\jrzh\\example\\c1.txt","rt"))==NULL){
        printf("
Cannot open file strike any key exit!"); getch(); exit(1); } ch=fgetc(fp); while(ch!=EOF){ putchar(ch); ch=fgetc(fp); } fclose(fp); }

この例のプログラムの機能は、ファイルから文字を1つずつ読み出し、画面に表示することです.プログラムはファイルポインタfpを定義し、テキストファイルを読むようにファイル「d:\jrzh\example\ex 1_1.c」を開き、fpをそのファイルに指し示す.ファイルを開くエラーが発生した場合、プロンプトが表示され、プログラムを終了します.プログラムの10行目はまず1文字を読み出してループに入り、読み出された文字がファイル終了フラグ(各ファイルの末尾に終了フラグEOFがある)でない限り、その文字を画面に表示し、次の文字を読み込みます.読み上げるたびに、ファイル内部の位置ポインタが1文字後ろに移動し、ファイル終了時にそのポインタがEOFを指します.このプログラムを実行すると、ファイル全体が表示されます.2)文字関数fputc fputc関数を書く機能は、指定したファイルに1文字を書き込むことです.関数呼び出しの形式は、fputc(文字量、ファイルポインタ);ここで、書き込まれる文字量は、例えば、fputc('a',fp);その意味は、文字aをfpが指すファイルに書き込むことである.fputc関数の使用についても、いくつかの点を説明します.
書き込みされたファイルは、書き込み、読み書き、追加で開くことができ、既存のファイルを書き込みまたは読み書きで開くと、既存のファイルの内容が消去され、書き込み文字はファイルの先頭から始まります.既存のファイルの内容を保持する必要がある場合は、書き込みたい文字をファイルの末尾で保存し、追加でファイルを開く必要があります.
書き込まれたファイルが存在しない場合は、そのファイルを作成します.1文字を書き込むたびに、ファイル内部の位置ポインタが1バイト後ろに移動します.
fputc関数には、書き込みに成功すると書き込み文字が返され、そうでないとEOFが返されます.書き込みが成功したかどうかを判断するには、これを使用します.
【例13−2】キーボードから1行の文字を入力し、1つのファイルに書き込み、そのファイル内容を読み出して画面に表示する.
 
#include
main(){
    FILE *fp;
    char ch;
    if((fp=fopen("d:\\jrzh\\example\\string","wt+"))==NULL){
        printf("Cannot open file strike any key exit!");
        getch();
        exit(1);
    }
    printf("input a string:
"); ch=getchar(); while (ch!='
'){ fputc(ch,fp); ch=getchar(); } rewind(fp); ch=fgetc(fp); while(ch!=EOF){ putchar(ch); ch=fgetc(fp); } printf("
"); fclose(fp); }

プログラムの5行目は、テキストファイルを読み書きするようにファイルstringを開きます.プログラム11行目はキーボードから1文字を読み込んでループに入り、読み込んだ文字がリターン文字でない場合はファイルに書き込み、キーボードから次の文字を読み込み続けます.文字を入力するたびに、ファイル内部の位置ポインタが1バイト後ろに移動します.書き込みが完了しました.このポインタはファイルの末尾を指しています.ファイルを最初から読み出すには、ポインタをファイルヘッダに移動し、プログラムの16行目のrewind関数はfpが指すファイルの内部位置ポインタをファイルヘッダに移動するために使用されます.17行目から21行目は、ファイル内の1行の内容を読み出すために使用される.【例13−3】コマンドラインパラメータの前のファイル名で識別されたファイルを、後のファイル名で識別されたファイルにコピーし、コマンドラインに1つのファイル名しかない場合は、そのファイルを標準出力ファイル(ディスプレイ)に書き込む.
 
 
#include
main(int argc,char *argv[]){
    FILE *fp1,*fp2;
    char ch;
    if(argc==1){
        printf("have not enter file name strike any key exit");
        getch();
        exit(0);
    }
    if((fp1=fopen(argv[1],"rt"))==NULL){
        printf("Cannot open %s
",argv[1]); getch(); exit(1); } if(argc==2) fp2=stdout; else if((fp2=fopen(argv[2],"wt+"))==NULL){ printf("Cannot open %s
",argv[1]); getch(); exit(1); } while((ch=fgetc(fp1))!=EOF) fputc(ch,fp2); fclose(fp1); fclose(fp2); }

このプログラムは参照付きmain関数です.プログラムでは、コマンドラインパラメータで与えられたファイルをそれぞれ指す2つのファイルポインタfp 1とfp 2が定義されている.コマンドラインパラメータにファイル名が指定されていない場合は、プロンプト情報が表示されます.プログラムの15行目は、ファイル名が1つしか与えられていない場合、fp 2を標準出力ファイルに向ける(即ちディスプレイ).プログラム21行目から24行目はループ文でファイル1中の文字を1つずつ読み出してファイル2に送る.再実行時には、ファイル名が1つ与えられるので、標準出力ファイルstdoutに出力し、即ちディスプレイにファイル内容を表示する.3回目の実行では、2つのファイル名が与えられるので、string中の内容を読み出してOKに書き込む.DOS命typeにOKの内容を表示させます.
 
文字列読み書き関数fgetsとfputs
1)文字列関数fgets関数を読み出す機能は、指定したファイルから文字列を文字配列に読み出すことであり、関数呼び出しの形式は、fgets(文字配列名、n、ファイルポインタ)である.nは正の整数です.ファイルから読み出した文字列がn-1文字を超えないことを示す.最後の文字を読み込んだ後にシリアル終了フラグ'0'を付けます.例えば、fgets(str,n,fp);の意味は、fpが指すファイルからn−1文字を読み出して文字配列strに送り込むことである.【例13−4】stringファイルから10文字の文字列を読み込む.
 
#include
main(){
    FILE *fp;
    char str[11];
    if((fp=fopen("d:\\jrzh\\example\\string","rt"))==NULL){
        printf("
Cannot open file strike any key exit!"); getch(); exit(1); } fgets(str,11,fp); printf("
%s
",str); fclose(fp); }

この例では、1文字配列strの合計11バイトを定義し、ファイルstringをテキストファイルで開くと、そこから10文字を読み出してstr配列に送り込み、配列の最後のセルに'0'を加えて画面に出力str配列を表示します.出力された10文字は【例13-1】プログラムの上位10文字です.fgets関数には2つの説明があります.
 
n-1文字を読み出す前に、改行やEOFに遭遇した場合、読み出しは終了する.
fgets関数にも戻り値があり、その戻り値は文字配列のヘッダアドレスである.
2)文字列関数fputs fputs関数を書く機能は、指定したファイルに文字列を書き込むことであり、その呼び出し形式は:fputs(文字列、ファイルポインタ);ここで、文字列は文字列定数であってもよいし、文字配列名であってもよいし、ポインタ変数であってもよい.例えば、fputs(「abcd」,fp);文字列「abcd」をfpが指すファイルに書き込むことを意味する.【例13−5】【例13−2】で作成したファイルstringに文字列を追加する.
 
#include
main(){
    FILE *fp;
    char ch,st[20];
    if((fp=fopen("string","at+"))==NULL){
        printf("Cannot open file strike any key exit!");
        getch();
        exit(1);
    }
    printf("input a string:
"); scanf("%s",st); fputs(st,fp); rewind(fp); ch=fgetc(fp); while(ch!=EOF){ putchar(ch); ch=fgetc(fp); } printf("
"); fclose(fp); }

この例ではstringファイルの末尾に文字列を書き込むことが要求されるため,プログラム5行目には読み書きテキストファイルを追加するようにファイルstringを開く.次に文字列を入力し、fputs関数でその列をファイルstringに書き込みます.プログラム15行でrewind関数でファイル内部位置ポインタをファイルヘッダに移動します.次に、現在のファイルのすべての内容をループして表示します.
 
データブロック読み書き関数freadとfwrite
C言語では、ブロック全体のデータに対する読み書き関数も提供される.配列要素、構造変数の値など、データのセットを読み書きできます.リードデータブロック関数呼び出しの一般的な形式はfread(buffer,size,count,fp);書き込みデータブロック関数呼び出しの一般的な形式は、fwrite(buffer,size,count,fp);次のようになります.
buffer:fread関数で、入力データを格納するヘッダアドレスを表すポインタです.
fwrite関数では、出力データを格納するヘッダアドレスを表します.
size:データブロックのバイト数を表します.
count:読み書きするデータブロックの数を表します.
fp:ファイルポインタを表します.例えばfread(fa,4,5,fp);その意味は、fpが指すファイルから、4バイト(実数1個)ずつ実配列faに送り込み、5回連続して読む、すなわち5個の実数をfaに読み出すことである.【例13−6】キーボードから2つの学生データを入力し、1つのファイルに書き込み、2つの学生のデータを読み出して画面に表示する.
#include
struct stu{
    char name[10];
    int num;
    int age;
    char addr[15];
}boya[2],boyb[2],*pp,*qq;
main(){
    FILE *fp;
    char ch;
    int i;
    pp=boya;
    qq=boyb;
    if((fp=fopen("d:\\jrzh\\example\\stu_list","wb+"))==NULL){
        printf("Cannot open file strike any key exit!");
        getch();
        exit(1);
    }
    printf("
input data
"); for(i=0;i<2;i++,pp++) scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr); pp=boya; fwrite(pp,sizeof(struct stu),2,fp); rewind(fp); fread(qq,sizeof(struct stu),2,fp); printf("

name\tnumber age addr
"); for(i=0;i<2;i++,qq++) printf("%s\t%5d%7d %s
",qq->name,qq->num,qq->age,qq->addr); fclose(fp); }

この例のプログラムは、2つの構造配列boyaおよびboyb、および2つの構造ポインタ変数ppおよびqqを説明する構造stuを定義する.ppはboyaを指し、qqはboybを指す.プログラム14行目は、読み書き方式でバイナリファイル「stu_list」を開き、2つの学生データを入力した後、そのファイルに書き込み、ファイル内部位置ポインタをファイルヘッダに移動し、2つの学生データを読み出して画面に表示する.
読み書き関数fscanfとfprintfのフォーマット
fscanf関数、fprintf関数は、前に使用したscanf関数とprintf関数の機能と似ており、いずれも読み書き関数をフォーマットしています.両者の違いは、fscanf関数とfprintf関数の読み書きオブジェクトがキーボードやディスプレイではなくディスクファイルであることです.この2つの関数の呼び出しフォーマットは、fscanf(ファイルポインタ、フォーマット文字列、入力テーブル列)です.fprintf(ファイルポインタ、フォーマット文字列、出力テーブル列);例えば、fscanf(fp,"%d%s",&i,s);    fprintf(fp,"%d%c",j,ch); 例10.6の問題は、fscanfおよびfprintf関数を用いても達成できる.修正後のプログラムを【例10-7】に示す.【例13-7】fscanfとfprintf関数で【例10-6】となる問題.
#include
struct stu
{
  char name[10];
  int num;
  int age;
  char addr[15];
}boya[2],boyb[2],*pp,*qq;
main(){
    FILE *fp;
    char ch;
    int i;
    pp=boya;
    qq=boyb;
    if((fp=fopen("stu_list","wb+"))==NULL){
        printf("Cannot open file strike any key exit!");
        getch();
        exit(1);
    }
    printf("
input data
"); for(i=0;i<2;i++,pp++) scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr); pp=boya; for(i=0;i<2;i++,pp++) fprintf(fp,"%s %d %d %s
",pp->name,pp->num,pp->age,pp->addr); rewind(fp); for(i=0;i<2;i++,qq++) fscanf(fp,"%s %d %d %s
",qq->name,&qq->num,&qq->age,qq->addr); printf("

name\tnumber age addr
"); qq=boyb; for(i=0;i<2;i++,qq++) printf("%s\t%5d %7d %s
",qq->name,qq->num, qq->age,qq->addr); fclose(fp); }

【例10−6】と比較して、本プログラムではfscanfとfprintf関数は1回に1つの構造配列要素しか読み書きできないため、ループ文を用いてすべての配列要素を読み書きする.ポインタ変数ppにも注意し、qqはループによってそれらの値が変化するため、プログラムでは配列のヘッダアドレスを再付与する.
回転:http://see.xidian.edu.cn/cpp/html/107.html