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);
}