C语言fread函数问题

源程序如下:#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;intnum[20],i=0;if((fp=fope... 源程序如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int num[20],i=0;
if((fp=fopen("input.in","r"))==NULL){
printf("Cannot open this file.\n");
exit(0);}
while(!feof(fp)){
fread(num,2,1,fp);
i++;}
for(i=0;i<20;i++)printf("%d\n",num[i]);
return 0;
}

input.in内容为:
5 12
376 5 3

本意是读入文件内容后输出,为什么输出是一大堆很大的数?
展开
 我来答
公主燕茜
2011-02-25 · TA获得超过507个赞
知道小有建树答主
回答量:697
采纳率:0%
帮助的人:0
展开全部
fer, size_t Size, size_t Count, FILE * Stream);
Size:每个要读取的元素的大小,单位字节----第二个参数
Count:要读取的元素个数------------------第三个参数
函数的返回值是实际读出元素的个数。

fwrite的第二和第三个参数及返回值的含义同上。

用fread(temp,1024,1,fp)也能读出,意思是一个元素的大小是1024个字节,每次读取一个,这在读取前面内容时没问题,当读到最后,加入只剩下100个字节的数据,不足1024字节时,程序返回0,你无法知道程序最后一次读出了多少数据。如果用fread(temp,1,1024,fp),则程序每次返回读出数据的字节数,即使读最后100个字节时,也返回100,这样你可以利用返回值知道程序读出了多少数据。

你程序中用'\0'判断读出数据的结束标志,也是有问题的。mp3文件中本身就有很多NULL字符,用strchr(temp,'\0'); 返回的指针未必指向读出数据的结束标志,可能指向读出数据中的某位。我实际试验了一下,用这种方法,4M多的1.mp3,最终只能得到800多k的2.mp3。正确的做法是利用fread的返回值作为fwrite的输入。

最终程序修改如下,去除了打印代码:
#include <stdio.h>
#include <string.h>
void main()
{
FILE *fp;
FILE *fpw;
char temp[1024];
int bsize;

fp=fopen("c:/book/1.mp3","rb");
fpw=fopen("c:/book/2.mp3","wb");
if(fp==NULL)
{
printf("can not open file\n");
}
temp[1023]='\0';

while(!feof(fp))
{
bsize = fread(temp,1,sizeof(temp)-1,fp);
fwrite(temp,1,bsize,fpw);
}

fclose(fp);
fclose(fpw);

}
sun_siliang
2011-02-25 · TA获得超过2.6万个赞
知道大有可为答主
回答量:9913
采纳率:100%
帮助的人:4666万
展开全部
//fread用来读二进制文件,你的文件格式有问题;
//下面这个程序是先建立二进制文件,再读。经测试通过。
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int num[20]={5,12,376,5,3},i=0;
if((fp=fopen("c:\\input.in","w"))==NULL){
printf("Cannot open this file.\n");
exit(0);}
for(int i=0;i<5;i++){
fwrite(&num[i],sizeof(int),1,fp);
}
fclose(fp);
if((fp=fopen("c:\\input.in","r"))==NULL){
printf("Cannot open this file.\n");
exit(0);}
while(!feof(fp)){
fread(&num[i],sizeof(int),1,fp);
i++;}
for(int j=0;j<i-1;j++)printf("%d\n",num[j]);
fclose(fp);
return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户68337
2011-03-05 · 超过33用户采纳过TA的回答
知道答主
回答量:162
采纳率:100%
帮助的人:0
展开全部
fer, size_t Size, size_t Count, FILE * Stream);
Size:每个要读取的元素的大小,单位字节----第二个参数
Count:要读取的元素个数------------------第三个参数
函数的返回值是实际读出元素的个数。

fwrite的第二和第三个参数及返回值的含义同上。

用fread(temp,1024,1,fp)也能读出,意思是一个元素的大小是1024个字节,每次读取一个,这在读取前面内容时没问题,当读到最后,加入只剩下100个字节的数据,不足1024字节时,程序返回0,你无法知道程序最后一次读出了多少数据。如果用fread(temp,1,1024,fp),则程序每次返回读出数据的字节数,即使读最后100个字节时,也返回100,这样你可以利用返回值知道程序读出了多少数据。

你程序中用'\0'判断读出数据的结束标志,也是有问题的。mp3文件中本身就有很多NULL字符,用strchr(temp,'\0'); 返回的指针未必指向读出数据的结束标志,可能指向读出数据中的某位。我实际试验了一下,用这种方法,4M多的1.mp3,最终只能得到800多k的2.mp3。正确的做法是利用fread的返回值作为fwrite的输入。

最终程序修改如下,去除了打印代码:
#include <stdio.h>
#include <string.h>
void main()
{
FILE *fp;
FILE *fpw;
char temp[1024];
int bsize;

fp=fopen("c:/book/1.mp3","rb");
fpw=fopen("c:/book/2.mp3","wb");
if(fp==NULL)
{
printf("can not open file\n");
}
temp[1023]='\0';

while(!feof(fp))
{
bsize = fread(temp,1,sizeof(temp)-1,fp);
fwrite(temp,1,bsize,fpw);
}

fclose(fp);
fclose(fpw);

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友81e9b7e
2011-02-25 · TA获得超过192个赞
知道答主
回答量:230
采纳率:0%
帮助的人:85.9万
展开全部
fread(num,2,1,fp);
改成 fread(num,sizeof(int),1,fp);
试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
菜刀撒
2011-03-11 · TA获得超过313个赞
知道小有建树答主
回答量:487
采纳率:0%
帮助的人:278万
展开全部
打开文件后一定要记得关闭,在程序读完文件后加一句 fclose()
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式