为什么 fgetc 返回 ffffffff 而不是文件中的实际数据?
Why is fgetc returning ffffffff instead of actual data in file?
我正在编写一个程序来读取十六进制图像文件,并将其中的一部分写入另一个文件。
当我读取它时,文件的某些部分被正确读取,但在它之间的某处开始读取并返回 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, 32, SEEK_CUR);
i = 1;
while (i <= 4919 && l < 5280)
{
ch = fgetc(source);
sprintf(buf, "%02x ", ch);
fputs(buf, sg);
i++;
} //GREEEN done
l++;
fseek(source, 32, SEEK_CUR);
i = 1;
while (i <= 4919 && l < 5280)
{
ch = fgetc(source);
sprintf(buf, "%02x ", ch);
fputs(buf, 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 已经告诉你的内容。当您将结果存储在 unsigned char
中时,fgetc()
return 是一个 int
。这意味着如果您阅读 0xff
或 EOF(EOF 在我的系统中定义为 -1,而在 2 的补码中为 0xff
),则无法从 ch
中分辨出来。当您处理二进制数据时,您想要更改类型。始终检查 return 值!
int ch;
...
if((ch = fgetc(source)) == EOF) {
// nothing more to read
}
我正在编写一个程序来读取十六进制图像文件,并将其中的一部分写入另一个文件。
当我读取它时,文件的某些部分被正确读取,但在它之间的某处开始读取并返回 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, 32, SEEK_CUR);
i = 1;
while (i <= 4919 && l < 5280)
{
ch = fgetc(source);
sprintf(buf, "%02x ", ch);
fputs(buf, sg);
i++;
} //GREEEN done
l++;
fseek(source, 32, SEEK_CUR);
i = 1;
while (i <= 4919 && l < 5280)
{
ch = fgetc(source);
sprintf(buf, "%02x ", ch);
fputs(buf, 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 已经告诉你的内容。当您将结果存储在 unsigned char
中时,fgetc()
return 是一个 int
。这意味着如果您阅读 0xff
或 EOF(EOF 在我的系统中定义为 -1,而在 2 的补码中为 0xff
),则无法从 ch
中分辨出来。当您处理二进制数据时,您想要更改类型。始终检查 return 值!
int ch;
...
if((ch = fgetc(source)) == EOF) {
// nothing more to read
}