fread()返回值总是0

lixiaofeng523 2009-12-08 02:21:58
代码如下:
void main(void)
{
int size = 1;
long n = 0;
int read_size = 0;
char *file_name = "1khz_7s.mp3";//是一个mp3文件
char *buffer = NULL;
FILE *fp;
FILE *stream;


fp = fopen(file_name, "rb");//fopen正确,fp!=NULL
if (NULL == fp)
{
printf("open file:%s falied\n", file_name);
return;
}
fseek(fp, 0, SEEK_END);
n = ftell(fp);
printf("n=%d\n", n);//执行到这时,n=113746,确实是文件的大小,我用UE打开文件数过

buffer = (char *)malloc(n+1);//缓冲区分配正确,buffer的地址不为NULL
if (NULL == buffer)
{
printf("malloc buffer falied and the data doesn't convert\n");
return;
}
printf("buffer address is:0x%08x\n", buffer);
memset(buffer, 0, n+1);
read_size = fread(buffer, 1, n, fp);//此处,read_size的值总是0,为什么?
if (ferror(fp))//检测文件操作是否有错,返回的是0,即不执行下面的printf语句
{
printf("read file:%s falied\n", file_name);
}
printf("read_size=%d\n", read_size);
printf("buffer[0]=0x%02x,buffer[1]=0x%02x\n", buffer[0], buffer[1]);



stream = fopen("mp3.bin", "wb+");
if (stream == NULL)
{
printf("can't open the file mp3.bin or can't create the file");
return;
}
fwrite(buffer, size, n, stream);

free(buffer);
fclose(fp);
fclose(stream);
}

代码的执行过程我已经用注释注明了。哪位能看出是什么问题,小弟不胜感激,谢谢先!
...全文
1620 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lylm 2009-12-08
  • 打赏
  • 举报
回复
fseek(fp, 0, SEEK_END);
LZ这里已经移到末尾了
hbvanguard 2009-12-08
  • 打赏
  • 举报
回复

fseek(fp, 0, SEEK_END); //在这里你把文件指针指到了文件末尾后面用fread当然读不出来了
:
:
rewind(fp);//fread之前把文件指针重新指回文件头
fread();
deng1243 2009-12-08
  • 打赏
  • 举报
回复
正解
lixiaofeng523 2009-12-08
  • 打赏
  • 举报
回复
哦,对,陷入死圈套了,谢谢哥们了。真是笨啊,我!
mstlq 2009-12-08
  • 打赏
  • 举报
回复
fseek(fp, 0, SEEK_END);之后……
读取的时候忘了fseek(fp, 0, SEEK_SET); 回来……

下面的就好了


#include <iostream>
#include <string>
using namespace std;

int main(void)
{
int size = 1;
long n = 0;
int read_size = 0;
char *file_name = "1khz_7s.mp3";//是一个mp3文件
char *buffer = NULL;
FILE *fp;
FILE *stream;


fp = fopen(file_name, "rb");//fopen正确,fp!=NULL
if (NULL == fp)
{
printf("open file:%s falied\n", file_name);
return 1;
}
fseek(fp, 0, SEEK_END);
n = ftell(fp);
printf("n=%d\n", n);//执行到这时,n=113746,确实是文件的大小,我用UE打开文件数过

buffer = (char *)malloc(n+1);//缓冲区分配正确,buffer的地址不为NULL
if (NULL == buffer)
{
printf("malloc buffer falied and the data doesn't convert\n");
return 1;
}
printf("buffer address is:0x%08x\n", buffer);
memset(buffer, 0, n+1);

fseek(fp, 0, SEEK_SET); //将指针重置到文件头……
read_size = fread(buffer, 1, n, fp);//此处,read_size的值总是0,为什么?
if (ferror(fp))//检测文件操作是否有错,返回的是0,即不执行下面的printf语句
{
printf("read file:%s falied\n", file_name);
}
printf("read_size=%d\n", read_size);
printf("buffer[0]=0x%02x,buffer[1]=0x%02x\n", buffer[0], buffer[1]);


stream = fopen("mp3.bin", "wb+");
if (stream == NULL)
{
printf("can't open the file mp3.bin or can't create the file");
return 1;
}
fwrite(buffer, size, n, stream);

free(buffer);
fclose(fp);
fclose(stream);
return 0;
}
james_hw 2009-12-08
  • 打赏
  • 举报
回复
ftell把fp指针移动了
james_hw 2009-12-08
  • 打赏
  • 举报
回复

read_size = fread(buffer, 1, n, fp);//此处,read_size的值总是0,为什么?

前面加一句fseek(fp,0,SEEK_SET);

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧