#2
by かずま » 8年前
現在多くの CPU は、リトルエンディアンです。
ファイルのサイズが偶数の時、最後にある FF D9 は、short の buffer に
0xD9FF として入ります。だから、" Found 0xFFD9\n" が出ません。
ファイルのサイズが奇数の時、例えば、最後が 3F FF D9 だったとすれば、
buffer に 0xFF39 が入った後、最後の 1バイトの D9 だけが buffer の下位
1バイトに上書きされ、buffer が 0xFFD9 になり、" Found 0xFFD9\n" が出ます。
2バイトずつではなく、1バイトずつ読み込むようにしたほうが良いでしょう。
コード:
#include <stdio.h> // fopen, fclose, fseek, ftell, getc, putc, puts, printf
int main(int argc, char *argv[])
{
FILE *fp1 = fopen(argv[1], "rb");
if (!fp1) return printf("can't open %s\n", argv[1]), 1;
FILE *fp2 = fopen(argv[2], "wb");
if (!fp2) return printf("can't create %s\n", argv[2]), 2;
long read_sum = 0, file_size;
int c;
fseek(fp1, 0, SEEK_END);
file_size = ftell(fp1);
fseek(fp1, 0, SEEK_SET);
while ((c = getc(fp1)) != EOF) {
read_sum++, putc(c, fp2);
if (c == 0xff) {
if ((c = getc(fp1)) == EOF) break;
read_sum++, putc(c, fp2);
if (c == 0xd9) {
puts(" Found 0xFFD9");
break;
}
}
}
fclose(fp2), fclose(fp1);
if (read_sum != file_size) puts(" Not Copied Completely");
return 0;
}
現在多くの CPU は、リトルエンディアンです。
ファイルのサイズが偶数の時、最後にある FF D9 は、short の buffer に
0xD9FF として入ります。だから、" Found 0xFFD9\n" が出ません。
ファイルのサイズが奇数の時、例えば、最後が 3F FF D9 だったとすれば、
buffer に 0xFF39 が入った後、最後の 1バイトの D9 だけが buffer の下位
1バイトに上書きされ、buffer が 0xFFD9 になり、" Found 0xFFD9\n" が出ます。
2バイトずつではなく、1バイトずつ読み込むようにしたほうが良いでしょう。
[code=c]
#include <stdio.h> // fopen, fclose, fseek, ftell, getc, putc, puts, printf
int main(int argc, char *argv[])
{
FILE *fp1 = fopen(argv[1], "rb");
if (!fp1) return printf("can't open %s\n", argv[1]), 1;
FILE *fp2 = fopen(argv[2], "wb");
if (!fp2) return printf("can't create %s\n", argv[2]), 2;
long read_sum = 0, file_size;
int c;
fseek(fp1, 0, SEEK_END);
file_size = ftell(fp1);
fseek(fp1, 0, SEEK_SET);
while ((c = getc(fp1)) != EOF) {
read_sum++, putc(c, fp2);
if (c == 0xff) {
if ((c = getc(fp1)) == EOF) break;
read_sum++, putc(c, fp2);
if (c == 0xd9) {
puts(" Found 0xFFD9");
break;
}
}
}
fclose(fp2), fclose(fp1);
if (read_sum != file_size) puts(" Not Copied Completely");
return 0;
}
[/code]