编译器char 为有符号,读二进制文件时:
fgetc()的原型为,int fgetc(FILE *stream);返回的为int型数据,而非char
当到达文件尾或出错时返回-1,而其它情况返回的一律一正数!
如果之前向文件写了任何负的char,返回的也为正数
返回的数为:直接读得的8位0/1转化成一无符号的int,例如:0xff 对应255(不是-1)
因此返回的值范围为0--255,个数为2^8个,算上到达文件尾的-1,共2^8+1个,比8位0/1所能表示的最大信息个数2^8多一个,用来说明是否到达文件尾或出错
之前向文件写了负的char时:fgetc()返回其补码对于的无符号正数,但我们经常char c=fgetc(),此时int转化成char,之前的负数就将回来。如果先前写了-1,fgetc()返回255,毫无疑问后来c=-1,但如果到达文件尾或出错fgetc()返回-1,char c=fgetc()后c也将变成-1。两种情况c都将为-1!因此char c=fgetc();c==-1时我们不能判断是到了文件尾,还是读得的数据为-1。例如:读文件通过char c; while((c=fgetc(p))!=-1){/*other codes*/}判断文件尾时可能在文件还没有读完时就停止,而正确的做法应当char c;int m;while((m=fgetc(p))!=-1){c=m;/* other codes*/},当然判断文件尾也可以使用feof()等
简而言之:fgetc()返回-1时并不是真的读到了-1(0xff),而是真的到了文件尾或出错了,当读到了-1(0xff)时它也不返回-1,而如果char c=fgetc(),只观察c的值将使得刚才的两种情况合并