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

#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 读到了文件末尾没?

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);

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-03-27
fread函数如果执行成功,它的返回值是你成功读到的字节数,如果返回值等于0表示你已经读到结尾,可以这样写
int readNum = 0;
if ((readNum = fread(...)) > 0)
{
//做事;
}
else
//文件已经读完,应该做什么就做什么吧;
第2个回答  2009-03-27
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));
}
第3个回答  2009-03-27
问题出在
一是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));
}

C语言高手帮忙:fread 函数的问题
函数的返回值是实际读出元素的个数。fwrite的第二和第三个参数及返回值的含义同上。用fread(temp,1024,1,fp)也能读出,意思是一个元素的大小是1024个字节,每次读取一个,这在读取前面内容时没问题,当读到最后,加入只剩下100个字节的数据,不足1024字节时,程序返回0,你无法知道程序最后一次读出了...

c语言 fread的问题
(5) 要用fread 读取, 你原来的文件 必须 用 "wb" 方式打开 和 用 fwrite 写成。

C语言 fread函数的问题
首先,fread读出的信息必须是fwrite写入的信息才能保证 读出信息的正确性 所以 你要读 就会读出一个学生的信息 而且你不会读出20字节的名字 地址同理 确定结构体的大小可以用sizeof关键字 下面是fwrite fread的函数原型 size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream...

C语言中fread的一些疑问
由上面介绍知道fread函数的第一个参数是个指针变量,可以指向任意类型实参!严归正传,对于你这里的问题, 你代码中的s是个结构体数组变量,跟普通数组变量一样,数组名本身就是个指针常量,所以在buffer位置写成s是没有问题的。那么为什么你这里读会变乱码呢?虽然你帖的代码并没有全,但从你说的读取...

C语言fread()函数读取出问题,求大神解答
fread() 用于2进制文件的读。被读的文件应当是2进制文件,并且是用 fwrite() 写成的。文件打开 必须 用到 "b" (2进制) -- "rb" "wb" ...又读又写文件,注意文件指针位置的控制,般动,回绕文件等等,并保证文件及时写出(调 fflush() )。分别读,写文件,注意文件 关闭,文件打开的顺...

C语言 fread函数的疑问?
读取的元素个数为1。sizeof得到的是元素大小。从一个文件流中读数据,读取 1个元素 ,每个元素 sizeof字节.如果调用成功返回值大于1。如不成功,返回实际读取的元素个数,小于1.满意请采纳,还有问题请追问。

C语言fread函数问题
函数的返回值是实际读出元素的个数。fwrite的第二和第三个参数及返回值的含义同上。用fread(temp,1024,1,fp)也能读出,意思是一个元素的大小是1024个字节,每次读取一个,这在读取前面内容时没问题,当读到最后,加入只剩下100个字节的数据,不足1024字节时,程序返回0,你无法知道程序最后一次读出了...

C语言关于fread这个函数的问题
因为你的数组a没有进行正确的初始化。可以这样定义 char a[32]={0};===补充=== 哦,你的数组定义的太小了,读取的内容是32你的数组也是32,没有位置放置字符串结束符号\\0(值为0)。你把数组大小改为33就ok了

C语言fread函数问题
如果读取的是正确的文件(就是你先前用同样结构写了数据的那个文件),那就是对的 为了防止读错误的文件,可以在文件头加一个标志,文件头符合标志的才继续读取,否则不读,提示错误 一般可以用文件的大小来确定有多少个记录,一直读到EOF,记录读到的字节数,除以结构的字节数,得到共有多少个结构体 ...

C语言 文件中的fread 问题
void main(){ int n ;FILE *fp;if((fp=fopen("zifu.c","w+"))==NULL){ printf("cannot open the file\\n");exit(0);} char str[256],str1[256];gets(str);n=fprintf(fp,"%s",str);rewind(fp) ;fread(str1,sizeof(str),1,fp);str1[n] = 0 ;puts(str1);getchar() ...

相似回答
大家正在搜