微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 fgetc 返回 ffffffff 而不是文件中的实际数据?

如何解决为什么 fgetc 返回 ffffffff 而不是文件中的实际数据?

我正在编写一个程序来读取十六进制图像文件,并将其中的一部分写入另一个文件

当我读取它时,文件的某些部分被正确读取,但介于两者之间的某处开始读取并返回 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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。