C言語でファイルの書き込みや読み込みを行う方法です。
stdio.hのインクルードが必要です。
#include<stdio.h>
まずはファイルをオープンしてみます。
void fopenTest(void) { FILE *fp; /* ファイルオープン */ fp = fopen("test.txt", "rb"); if(fp) { /* ファイルあり */ printf("opened\n"); } else { /* ファイルなし */ printf("not opened\n"); } if(fp) { /* ファイルクローズ */ fclose(fp); } return; }
fopenを使用してファイルをオープンします。
fopenは以下のように定義されていて、指定されたpathのファイルを開ければFILE構造体のポインタを返します。
FILE *fopen(const char *path, const char *mode)
modeには読み込みの場合はr、書き込みはw、追加はaを指定します。
バイナリの場合はさらにbを指定します。
開けない場合はNULLとなるため、ファイルがない場合などは戻り値がNULLかどうかで判定できます。
そして、開いたファイルは最後にはfcloseで閉じる必要があります。
次は書き込みをしてみます。
static const unsigned char FILE_STR[] = "1234567890"; void fwriteTest(void) { FILE *fp; size_t ret; /* ファイルオープン */ fp = fopen("test.txt", "wb"); if(!fp) { /* ファイルなし */ printf("not opened\n"); goto END; } ret = fwrite(FILE_STR, 1, strlen(FILE_STR), fp); printf("ret = %d\n", ret); END: if(fp) { fclose(fp); } return; }
ファイルを開いて 1234567890 という文字列をfwriteで書き込んでいます。
fwriteは以下のように定義されています。
size_t fwrite(const void *ptr, size_t size, size_t num, FILE *fp)
ptrは文字列のポインタ、sizeは1度に書き込むバイト数、numは書き込む個数です。
戻り値として書き込んだ個数を返します。
上記の例では ptrに文字列 1234567890 、sizeに 1 、numには strlen(FILE_STR) つまり 10 を指定しているので、1文字ずつ10回書き込みます。
戻り値は10となります。
別の例として以下のように変更してみます。
ret = fwrite(FILE_STR, strlen(FILE_STR), 1, fp); printf("ret = %d\n", ret);
今度はsizeに10、numに1を指定しているので10文字ずつ1回書き込みとなります。
ファイルには 1234567890 が書き込まれますが、戻り値は1となります。
次は読み込みです。
void freadTest(void) { FILE *fp; unsigned char buffer[100]; size_t ret; memset(buffer, 0x00, sizeof(buffer)); /* ファイルオープン */ fp = fopen("test.txt", "rb"); if(!fp) { /* ファイルなし */ printf("not opened\n"); goto END; } ret = fread(buffer, 1, sizeof(buffer), fp); printf("ret = %d\n", ret); printf("buffer = %s\n", buffer); END: if(fp) { fclose(fp); } return; }
freadでファイルを読み込みます。
freadは以下のように定義されています。
size_t fread(void *ptr, size_t size, size_t num, FILE *fp)
ptrには読み込み先、sizeは1度に読み込むバイト数、numが読み込む個数、戻り値が読み込んだ個数となります。
test.txtの内容を 1234567890 としておき上記処理を実行すると、1文字ずつ100個読み込みます。
bufferには 1234567890 の10文字が読み込まれ、戻り値は10となります。
sizeとnumを入れ替えて以下のようにしてみます。
ret = fread(buffer, sizeof(buffer), 1, fp); printf("ret = %d\n", ret); printf("buffer = %s\n", buffer);
すると、bufferには 1234567890 が読み込まれていますが、戻り値は0となります。
100文字ずつ1回読み込みますが、読み込んだ文字列は10文字で100文字に満たないため1個にカウントされず0となります。
sizeに10を指定していれば戻り値は1となります。
このようにsizeとnumを入れ替えると読み書きの結果は同じですが、戻り値が異なります。
読み書きしたバイト数が知りたいの場合は、sizeは1、numにバイト数を指定する必要があります。
他に関数はありますが、
以上がC言語の基本的なファイル操作の方法です。