
高分!!请高手帮忙解释一下.fread函数出错了!
#include<stdio.h>voidmain(){printf("%c\n",'i');return;}这个文件编译成try.exe,进行以下操作.#include...
#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 展开
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 展开
3个回答
展开全部
你用二进制的方式读取文件就不会出错了
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类型,也会错
为什么错呢?我认为不需要去找原因了!
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类型,也会错
为什么错呢?我认为不需要去找原因了!

2023-06-12 广告
单片机,即单片微控制器,也称为单片微型计算机,是将中央处理器(CPU)、存储器(ROM,RAM)、输入/输出接口和其他功能部件集成在一块 在一个小块的集成电路上,从而实现对整个电路或系统的数字式控制。单片机不是完成某一个逻辑功能的芯片,而是...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
//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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询