使用getc可能fgetc读取bin文件出错

使用getc或者fgetc读取bin文件出错
本帖最后由 haolvshiqi 于 2015-04-11 10:59:39 编辑
各位大神好!
现在我遇到两个问题:
1、如果bin文件的字节数不是2的倍数,那么时候getc或者fgetc读取出来的字符总会多出很多。
比如我的bin文件本来只有209705,但是打印file_size却有234652。但是当我人工把bin文件添成209706,file_size打印出来就是209706。

2、我将ch的类型申明为char,将ch打印出来就是一些很诡异的数字,里面的0xffffff86是什么鬼,如下图:
使用getc可能fgetc读取bin文件出错

这是我的代码:

// 用于存储bin文件内容
int ch = NULL;
        // 用于存储文件字节数
int file_size = 0;

// 打开想要进行IAP的文件
fp = fopen("C:\\Users\\LSQ\\Desktop\\Ciston 20150311A\\DC8000_V2_2 - 副本.bin", "rb");

//fp = fopen("C:\\Users\\LSQ\\Desktop\\test\\test.bin", "r");
if (fp == NULL){
printf("file open failed!\n");
return FAIL;
}

UNREFERENCED_PARAMETER(Argc);
UNREFERENCED_PARAMETER(Argv);
ch = getc(fp);
while (ch != EOF){
//printf("0x%02x ", ch);

file_size++;
ch = getc(fp);
}


请问这是什么问题?
------解决思路----------------------
第一个问题嘛,从没碰到过这种情况,你试试其他的文件

引用:
bin文件里面存储的内容都是int类型的吗?

不管什么类型的文件存储的都是字节,至于为什么会有不同类型之分,那是人自己的理解问题,比如一个字节0x41,你可以把它当成文本,比如认为这个ASCII字符,那么它就是大写A,你也可以把它当成所谓“二进制”文件,那它也就是一个16进制数41或者10进制65
至于文件内容,那一样可以随意理解,比如一个文件有四个字节0xff 0xff 0x00 0x01,你可以认为内容是4个字节型,也就是4个char类型,你也可以认为这是1个整数型,就是1个int,所以问内容是什么类型的没有意义
------解决思路----------------------
用getc 来读取是会自动转编码的,(getc 读取的是一个字符,而不是一个字节)
但你用 rb 方式打开,应该没有编码问题...
如果是编码问题,那用getc 统计出的大小应该比原文件小!

既然用 rb ,建议还是用 fwrite / fread 来处理