Cファイルの読み書き


前章では、C言語処理の標準入出力デバイスについて説明しました。この章では、C プログラマーがテキスト ファイルまたはバイナリ ファイルを作成、オープン、クローズする方法を紹介します。

ファイルは、テキスト ファイルであってもバイナリ ファイルであっても、一連のバイトを表します。 C 言語は、アクセスするためのトップレベル関数を提供するだけでなく、ストレージ デバイス上のファイルを処理するための低レベル (OS) 呼び出しも提供します。この章では、ファイル管理の重要な呼び出しについて説明します。

ファイルを開く

fopen( ) 関数を使用して、新しいファイルを作成するか、既存のファイルを開くことができます。この呼び出しは、FILE タイプのオブジェクトを初期化します。このタイプには、すべての関数が含まれています。流れを制御するために必要な情報。この関数呼び出しのプロトタイプは次のとおりです:

FILE *fopen( const char * filename, const char * mode );
ここで、

filename

はファイルの名前に使用される文字列であり、アクセス モードの値modeは次の値のいずれかになります:

mode rwar+w+a+

バイナリ ファイルを扱う場合は、上記のアクセス モードの代わりに次のアクセス モードを使用する必要があります:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

ファイルを閉じる

; ファイルを閉じるには、fclose() 関数を使用します。関数のプロトタイプは次のとおりです。

 int fclose( FILE *fp );

fclose( ) 関数は、ファイルが正常に閉じられた場合は 0 を返し、ファイルを閉じるときにエラーが発生した場合は EOF を返します。この関数は実際にバッファ内のデータをクリアし、ファイルを閉じ、ファイルに使用されているすべてのメモリを解放します。 EOF はヘッダー ファイル stdio.h で定義される定数です。

C 標準ライブラリは、ファイルを 1 文字ずつ、または固定長の文字列として読み書きするためのさまざまな関数を提供します。

ファイルに書き込む

以下は、文字をストリームに書き込む最も単純な関数です:

int fputc( int c, FILE *fp );

関数

fputc() パラメータ c の文字値を fp が指す出力ストリームに書き込みます。書き込みが成功した場合は書き込まれた文字を返し、エラーが発生した場合は EOF を返します。次の関数を使用して、ヌル終了文字列をストリームに書き込むことができます。

int fputs( const char *s, FILE *fp );

関数

fputs() 文字列 s を fp が指す出力ストリームに書き込みます。書き込みが成功した場合は負ではない値を返し、エラーが発生した場合は EOF を返します。 int fprintf(FILE *fp,const char *format, ...) 関数を使用して文字列をファイルに書き込むこともできます。以下の例を試してください:

注: /tmp ディレクトリが利用可能であることを確認してください。存在しない場合は、まずコンピュータ上に作成する必要があります。

#include <stdio.h>main(){
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);}
上記のコードがコンパイルされて実行されると、/tmp ディレクトリに新しいファイル

test.txt

が作成され、2 つの異なる関数を使用して 2 行が書き込まれます。次にこのファイルを読んでみましょう。 ファイルの読み取り

ファイルから 1 文字を読み取る最も単純な関数を次に示します:

int fgetc( FILE * fp );

fgetc()

この関数は、fp が指す入力ファイルから文字を読み取ります。戻り値は読み取られた文字、またはエラーが発生した場合は EOF です。次の関数を使用すると、ストリームから文字列を読み取ることができます:

char *fgets( char *buf, int n, FILE *fp );
関数

fgets()

fp が指す入力ストリームから n - 1 文字を読み取ります。読み取った文字列をバッファ buf にコピーし、最後に null 文字を追加して文字列を終了します。 この関数が最後の文字を読み取る前に改行文字「n」またはファイルの終わり EOF に遭遇した場合、改行文字を含む、読み取られた文字のみが返されます。

int fscanf(FILE *fp, const char *format, ...)

関数を使用してファイルから文字列を読み取ることもできますが、最初のスペース文字に遭遇すると読み取りが停止します。

#include <stdio.h>main(){
   FILE *fp;   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);}
上記のコードがコンパイルされて実行されると、前のセクションで作成されたファイルが読み取られ、次の結果が生成されます。
1 : This2: is testing for fprintf...3: This is testing for fputs...

まず、fscanf() メソッドは、その後にスペースがあるため、This のみを読み取ります。次に、fgets()を呼び出して、行末まで残りを読み取ります。最後に、fgets()を呼び出して、2行目を完全に読み取ります。

バイナリ I/O 関数

次の 2 つの関数は、バイナリの入出力に使用されます:

size_t fread(void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);              size_t fwrite(const void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);

どちらの関数も、ストレージのブロック (通常は配列または構造体) の読み取りと書き込みに使用されます。

説明
既存のテキスト ファイルを開き、ファイルを読み取れるようにします。
テキスト ファイルを開き、ファイルへの書き込みを許可します。ファイルが存在しない場合は、新しいファイルが作成されます。ここで、プログラムはファイルの先頭から書き込みます。
テキスト ファイルを開き、追加モードでファイルに書き込みます。ファイルが存在しない場合は、新しいファイルが作成されます。ここで、プログラムは既存のファイルのコンテンツにコンテンツを追加します。
テキスト ファイルを開き、ファイルの読み取りと書き込みを可能にします。
テキスト ファイルを開き、ファイルの読み取りと書き込みを許可します。ファイルがすでに存在する場合、ファイルは長さ 0 に切り詰められ、ファイルが存在しない場合は、新しいファイルが作成されます。
テキスト ファイルを開き、ファイルの読み取りと書き込みを可能にします。ファイルが存在しない場合は、新しいファイルが作成されます。読み取りはファイルの先頭から開始され、書き込みは追加モードでのみ行われます。