为了账号安全,请及时绑定邮箱和手机立即绑定

C语言高手帮忙:fread 函数的问题?

C语言高手帮忙:fread 函数的问题?

SSM
跃然一笑 2019-02-13 15:11:56
#include <stdio.h>#include <string.h>void main(){FILE *fp;FILE *fpw;char temp[1024];for(i=0;i<sizeof(temp);i++){temp[i]='\0';}fp=fopen("c:/book/1.mp3","rb");if(fp==NULL){printf("can not open file\n");}fpw=fopen("c:/book/2.mp3","w+b"); while(!feof(fp)){fread(temp,sizeof(temp),1,fp);printf("%d\n%s\n",k,temp);k=strchr(temp,'\0');if(k==NULL){fwrite(temp,sizeof(temp),1,fpw); }else{fwrite(temp,int(k-temp),1,fpw); }memset(temp,0,sizeof(temp));} fclose(fp);fclose(fpw);}函数读到文件的最后老是会加入空格字符,要不然就直接死掉;有什么办法判断 fread 读到了文件末尾没?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

size_t fread (void * Buffer, 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);

}



查看完整回答
反对 回复 2019-03-26
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

while( 1 == 1 )
{
fread(temp,sizeof(temp),1,fp);
if ( feof(fp) ) break; // 读了,就测定 EOF
// 如果放在 while (!feof(fp))测定,最后读到EOF会多/重复输出一行
k=strchr(temp,'\0'); // k 先有值再输出
printf("%d\n%s\n",k,temp);
if(k==NULL)
{
fwrite(temp,sizeof(temp),1,fpw);
}
else
{
fwrite(temp,(int)(k-temp),1,fpw);
}
memset(temp,0,sizeof(temp));
}



查看完整回答
反对 回复 2019-03-26
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

问题出在
一是fread函数向缓冲区temp中输入字符串时,不会在结尾加‘\0’,而且如果一次fread后缓冲区被读满,结尾也不会有字符串结尾符‘\0’,所以打印出的字符串异常。
二是fread函数你传入的实参数顺序不对。这样改:
while(!feof(fp))
{
bsize = fread(temp,1,(sizeof(temp)-1),fp); //bsize是实际读入的字符数,把它定义为整型
temp[bsize] = '\0';
printf("%d\n%s\n",k,temp);
k=strchr(temp,'\0');
if(k==NULL)
{
fwrite(temp,sizeof(temp),1,fpw);
}
else
{
fwrite(temp,(int)(k-temp),1,fpw);
}
memset(temp,0,sizeof(temp));
}



查看完整回答
反对 回复 2019-03-26
  • 3 回答
  • 0 关注
  • 652 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信