[c言語] さっと復習(15) ファイル操作

ファイルへの入出力に関する型や変数は、stdio.h にある。

テキストファイル

書き込み

fopen("./test.txt", "w") で書き込みモードのフィアルポインタ。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE *file;

    // ファイルポインタ
    file = fopen("./test.txt", "w");

    // ファイルが開けない場合は異常終了
    if (file==NULL) {
        printf("Can not open a file...\n");
        exit(1);
    }

    fprintf(file, "Hello Fisrt World!\n");
    fprintf(file, "Hello Second World!\n");
    fclose(file);

    return 0;
}

読み込み

file = fopen("./test.txt", "r"); で読み込みモードのファイルポインタ。

1行ごとの読み込み

fgets

char * fgets( char *row , int len , FILE *fp );

ファイルポインタfpから1行、またはlenバイト読み込んでその先頭アドレスを返す。全行を読み込んだ場合、又はエラー時にNULL(\0)を返す。

#include <stdio.h>
#include <stdlib.h>

#define SIZE 256

int main(void) {
    FILE *file;
    char row[SIZE];
    row[0] = '\0';
    // ファイルポインタ
    file = fopen("./test.txt", "r");

    // ファイルが開けない場合は異常終了
    if (file==NULL) {
        printf("Can not open a file...\n");
        exit(1);
    }

    while (fgets(row, SIZE, file) != NULL) {
        printf("%s", row);
    }

    fclose(file);
    return 0;
}

1文字ごとの読み込み

fgetc

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE *file;
    int c;
    file = fopen("test.txt", "r");
    
    if (file == NULL) {
        printf("can not open file...\n");
        exit(1);
    }

    while ((c = fgetc(file)) != EOF) {
        printf("%c", (char)c);
    }

    fclose(file);
    return 0;
}

バイナリファイル

書き込み

fopen("test.bin", "wb"); でバイナリファイル書き込みのポインタ。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE *file;
    char data[] = {0x11, 0x1f, 0x21, 0x2f};
    
    file = fopen("test.bin", "wb");
    
    if (file == NULL) {
        printf("can not open file...\n");
        exit(1);
    }

    fwrite(data, sizeof(char), sizeof(data), file);

    fclose(file);
    return 0;
}

読み込み

fopen("test.bin", "rb"); でバイナリファイル読み込み用のポインタ。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE *file;
    char data[4];
    int i;
    
    file = fopen("test.bin", "rb");
    
    if (file == NULL) {
        printf("can not open file...\n");
        exit(1);
    }

    fread(data, sizeof(char), sizeof(data), file);
    fclose(file);

    for (i=0; i<sizeof(data); i++) {
        printf("0x%x ", data[i]);
    }
    printf("\n");

    return 0;
}

読み込みファイルのサイズがわかない場合は、malloc で動的に読み込みを保存するメモリを確保する。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE* file;
    long int size;
    int i;
    char* data;

    file = fopen("./test.bin", "rb");
    if (file == NULL) {
        printf("can not open file...\n");
        exit(1);
    }

    // ファイルサイズの取得 fseek してftell
    fseek(file, 0, SEEK_END);
    size = ftell(file);

    // malloc で動的に配列を生成
    data = (char*)malloc(sizeof(char)*(long unsigned int)size);

    // 先頭に戻り、ファイルを読み込む。
    fseek(file, 0, SEEK_SET);
    fread(data, sizeof(char), (long unsigned int)size, file);
    fclose(file);

    for (i=0; i<size; i++) {
        printf("0x%x ", data[i]);
    }
    printf("\n");

    free(data);

    return 0;
}