问题描述
我正在编写一个程序来读取十六进制图像文件,并将其中的一部分写入另一个文件。
当我读取它时,文件的某些部分被正确读取,但介于两者之间的某处开始读取并返回 FF 而不是文件中打开和关闭的实际十六进制数据。
我已将 unsigned char ch
用于 ch=fgetc(sourceImageFile)
我不明白我哪里出错了,以及为什么它会在中间返回一长串 FF。请帮我。 此外,我将一个输入文件保留为 .txt,以便能够打开它并进行调试。
这是我的代码:
#include<stdio.h>
#include<string.h>
int main()
{
FILE* source;
FILE* sr,* sg,* sb;
int i = 1;
source = fopen("file.L-4","r");
sr = fopen("red.img","wb+");
sg = fopen("green.img","wb+");
sb = fopen("blue.txt","wb+");
fseek(source,540,SEEK_SET);
printf("\nDone phew!\n");
unsigned char ch;
int l = 1;
unsigned char buf[10];
while (l <= 5279)
{
fseek(source,32,SEEK_CUR);
i = 1;
while (i <= 4919 && l < 5280)
{
ch = fgetc(source);
sprintf(buf,"%02x ",ch);
fputs(buf,sb);
i++;
} //BLUE done
L++;
//fseek(source,9902,SEEK_CUR);
fseek(source,sg);
i++;
} //GREEEN done
L++;
fseek(source,sr);
i++;
} //RED done
L++;
//printf("%d ",l);
}
printf("\nthis is done too!\n");
fclose(sr);
fclose(sg);
fclose(sb);
fclose(source);
return 0;
}
解决方法
只是转述@kaylum 已经告诉您的内容。当您将结果存储在 fgetc()
中时,int
返回 unsigned char
。这意味着您无法从 ch
中分辨出您读的是 0xff
还是 EOF(EOF 在我的系统上被定义为 -1,而在 2 的补码中是 0xff
)。在处理二进制数据时,您希望更改类型。始终检查返回值!
int ch;
...
if((ch = fgetc(source)) == EOF) {
// nothing more to read
}