高分!!请高手帮忙解释一下.fread函数出错了!

#include<stdio.h>
void main()
{
printf("%c\n",'i');
return;
}
这个文件编译成try.exe,进行以下操作.

#include<stdio.h>
int main()
{
FILE *fp=NULL;
char a[1000];
if((fp=fopen("try.exe","r"))==NULL) {printf("error!!");return 1;}
fread(a,sizeof(char),1000,fp);
/*
这里写上你测试的语句.
*/
return 0;
}

我想问的是:
a[0x74],a[0x75],a[0x76],a[0x77]这几个数看一下
是不是和try.exe中相应位置一样.
我的编译环境是VC6.0
测试结果,a[0x75]位置读漏了一个字节,
即在try.exe的0x75位置有连续的两个0x0D,但读到a数组里只剩一个0x0D了.
我把try.exe的0x76位置的0x0D改为其它的值,数组a在这个位置又对了.
我想请高手指一条明路小弟走,怎样才可以完整地把文件读取出来,而不会像这样少读了一个字节.
高金山朋友,谢谢你的回答,这样虽解决了读取的问题,但在这个例子中成立难以保证不会在其它例中子出错,像用"r"参数一样.
我只要把文件改一下,"r"参数也能正确读出.也就是说,这个文件刚好让"r"参数出错了.
我关心的是错误本身.
我想知道这种错误原因.应该是系统的错,我是想找出这种错是错在哪个环节.并找到解决这个错误的办法.
在此附上fread的实现细节,望指出在哪里读漏了一个字节.
http://hi.baidu.com/aauutthh/blog/item/828bfed89430173033fa1cf1.html

你用二进制的方式读取文件就不会出错了
fopen的第二个参数r修改为rb

#include<stdio.h>
int main()
{
char a[1000]={0};
FILE *fp=NULL;

if((fp=fopen("try.exe","rb"))==NULL) ////////////fopen的第二个参数r修改为rb
{
printf("error!!");
return 1;
}
fread(a,sizeof(char),1000,fp);
/*
这里写上你测试的语句.
*/
fclose(fp);
return 0;
}

补充:
你知道r是按文件文件读取的吧?rb是按二进制文件读取的吧?
exe文件,是二进制文件,又不是文本文件!!!

不论是文本文件,还是二进制文件,都按二进制文件读取,肯定是不会错的。
不管是哪个例子!

原因就在于“把二进制文件按文本文件读取”了啊!
这种做法的结果是错误的,才是正常的,不错到奇怪了!
就像你用scanf("%f",&d);其中d是double类型,也会错
为什么错呢?我认为不需要去找原因了!
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-06-14
//vc6.0调试通过
#include<stdio.h>
int main()
{
FILE *fp=NULL;
char a[1000];
int i=0;
if((fp=fopen("try.exe","r+"))==NULL) {printf("error!!");return 1;}
/*测试*/
while(!feof(fp))
{fread(&a[i],sizeof(char),1,fp);
printf("%c",a[i]);
}
/*测试结果
#include<stdio.h>
void main()
{
printf("%c\n",'i');
return;
} */
return 0;
}
第2个回答  2008-06-11
相似回答
大家正在搜