やれたらやるね

やれたらね

C言語 バイナリファイルR/W

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>

#define OUT_FILE_NAME   "out.bin"
#define RW_DATA_NUM     (1)

void main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("L%d argc=%d\n", __LINE__, argc);
        printf("errno=%d %s\n", errno, strerror(errno));
        return;
    }

    // 読み込むファイルを開く
    char    *inFile = argv[1];
    FILE    *fpIn = fopen(inFile, "rb");
    if (fpIn == NULL)
    {
        printf("L%d fopen(%s) == NULL\n", __LINE__, inFile);
        printf("errno=%d %s\n", errno, strerror(errno));
        return;
    }

    // 書き込むファイルを開く
    FILE    *fpOut = fopen(OUT_FILE_NAME, "wb");
    if (fpOut == NULL)
    {
        printf("L%d fopen(%s) == NULL\n", __LINE__, OUT_FILE_NAME);
        printf("errno=%d %s\n", errno, strerror(errno));
        fclose(fpIn);
        return;
    }

    // 読み込むファイルのサイズを取得する
    struct stat inFileStat;
    if (stat(inFile, &inFileStat) != 0)
    {
        printf("L%d stat(%s) != 0\n", __LINE__, inFile);
        printf("errno=%d %s\n", errno, strerror(errno));
        goto FILE_CLOSE;
    }

    // ファイルを読み込んで書き出す
    for (long size = 0; size < inFileStat.st_size; size++)
    {
        unsigned char data;
        if (fread(&data, sizeof(data), RW_DATA_NUM, fpIn) < RW_DATA_NUM)
        {
            printf("L%d fread failed. size=%ld, st_size=%ld\n", __LINE__, size, inFileStat.st_size);
            printf("errno=%d %s\n", errno, strerror(errno));
            goto FILE_CLOSE;
        }
        if (fwrite(&data, sizeof(data), RW_DATA_NUM, fpOut) < RW_DATA_NUM)
        {
            printf("L%d fwrite failed. size=%ld, st_size=%ld\n", __LINE__, size, inFileStat.st_size);
            printf("errno=%d %s\n", errno, strerror(errno));
            goto FILE_CLOSE;
        }
    }

FILE_CLOSE:
    // ファイルを閉じる
    fclose(fpIn);
    fclose(fpOut);
}