繰り返しますが、.raw ファイルから jpeg をコピーするプログラムを作成しようとしています。最初のヘッダー (0xffd8ffe0 または 0xffd8ffe1) が正常であることを検出し、ヘッダーを outptr に書き込み、jpeg データを 512 ビット チャンクでコピーします。do-while ループを記述して、512 ビット配列を読み取り、各配列をチェックして、(配列の最初の 4 バイトに) 新しいヘッダーが含まれていないことを確認します。 while ループを再び開始し、次のヘッダーをコピーしますが、別のヘッダーがそこにあることはわかっていても、別のヘッダーが見つからないようで、最後の 512 ビット チャンクの直後に来るはずです。
#include <stdio.h>
#include <stdint.h>
#define READFILE "/home/cs50/pset5/card.raw"
int
main(void)
{
// open readfile
FILE *inptr = fopen(READFILE, "r");
if (inptr == NULL)
{
printf("Could not open file.\n");
return 1;
}
while (feof(inptr) == 0)
{
// counter for writefilename
int writeCounter = 0;
// find a header by iterating until it finds a 0xff
int byte[4];
if (byte[0] != 0xff)
byte[0] = fgetc(inptr);
else
{
// then check if the next byte is 0xd8, if not, look for the next 0xff
byte[1] = fgetc(inptr);
if (byte[1] != 0xd8)
break;
else
{
// then check if the next byte is 0xff, if not, ditto
byte[2] = fgetc(inptr);
if (byte[2] != 0xff)
break;
else
{
// then check if the next byte is 0xe0 or 0xe1, if not, ditto
byte[3] = fgetc(inptr);
if (byte[3] == 0xe0 || byte[3] == 0xe1)
{
// since it's a header, start writin'
// open writefile
char filename[7];
sprintf(filename, "0%.2d.jpg", writeCounter);
FILE *outptr = fopen(filename, "w");
writeCounter++;
// replace byte[0] since sprintf seems to make it 0 for some reason
byte[0] = 0xff;
// write the header that's in array byte[]
fwrite(&byte, 4, 1, outptr);
// write pixels in 64-byte chunks until a new header is found
char pixel[64];
do
{
fread(&pixel, 64, 1, inptr);
if (pixel[0] == 0xff && pixel[1] == 0xd8 && pixel[2] == 0xff && (pixel[3] == 0xe0 || pixel[3] == 0xe1))
{
fseek(inptr, -64, SEEK_CUR);
break;
}
else
fwrite(&pixel, 64, 1, outptr);
} while (pixel[0] != 0xff && pixel[1] != 0xd8 && pixel[2] != 0xff && (pixel[3] != 0xe0 || pixel[3] != 0xe1));
}
else
break;
}
}
}
}
}