为什么 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
}