// バイナリファイルの読み書きサンプル
// １.バイナリファイルを読み込み
// ２．ダンプ風に標準出力に出力
// ３．バイナリファイルとしてそのまま別のファイルに出力

// ポイント１．ファイルをオープンする時のオプションはrb wbとbを付けます

// ポイント２．freadで読み込みます。
// パラメータは１．読込バッファ　２．読み込むサイズ　３．読み込む個数　４．ファイルポインタ
// サンプルはchar型(1byte)を512個の指定です。

// ポイント３．fwriteで書き込みます。
// パラメータは１．バッファのポインタ　２．書き込むサイズ　３．書き込む個数　４．ファイルポインタ
// 書き込みの個数は、読み込んだバイト数をそのまま使います。
#include <stdio.h>
#include <stdlib.h>

int main(void) {
	// ファイルポインタ
	FILE *fpr, *fpw;
	// 読込サイズを保存する変数
	int s;
	// ループカウンタ
	int i;

	// 読込バッファ
	char buff[512]; // ※8の倍数にしないとダンプ風出力が面倒かも

	// ダンプ風標準出力用
	char str[17] = "0123456789ABCDEF";

	// ポイント１．ファイルをオープンする時のオプションはrb wbとbを付ける
	fpr = fopen("logo3w.png", "rb");
	fpw = fopen("copy.png", "wb");
	if (fpr == NULL ) {
		puts("ファイルがないよ！");
		return EXIT_FAILURE;
	}

	// ポイント２．freadで読み込みます。
	// パラメータは１．読込バッファ　２．読み込むサイズ　３．読み込む個数　４．ファイルポインタ
	// サンプルはchar型(1byte)を512個の指定です。
	while ((s = fread(buff, sizeof(char), sizeof(buff), fpr)) != 0) {
		// ２．ダンプ風に標準出力に出力
		for (i = 0; i < s; i++) {
			// 上位4ビットをcharの0～Fに変換
			printf("%c", str[buff[i] / 16 & 15]);
			// 下位4ビットをcharの0～Fに変換
			printf("%c ", str[buff[i] & 15]);

			if (i % 8 == 7) {
				// 8バイト毎に改行
				printf("\n");
			}
		}

		// ポイント３．fwriteで書き込みます。
		// パラメータは１．バッファのポインタ　２．書き込むサイズ　３．書き込む個数　４．ファイルポインタ
		// 書き込みの個数は、読み込んだバイト数をそのまま使います。
		// ３．バイナリファイルとしてそのまま別のファイルに出力
		fwrite(buff, sizeof(char), s, fpw);
	}

	// ファイルクローズ
	fclose(fpr);
	fclose(fpw);
	return EXIT_SUCCESS;
}
