C言語のファイル操作

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言語の基本的なファイル操作の方法です。

スポンサーリンク