fread 读文件问题

jim900os 2003-09-12 09:21:32

函数fread 不知是不是有大小限制的。

long n=fread(temp,sizeof(byte),data_num,fp);

其中data_num=112000;
不知为何,返回 n=7239;
那位高手指点指点,谢谢。
...全文
642 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
TianGuangZao 2003-09-13
  • 打赏
  • 举报
回复
首先这里说声 sorry, 我把 fread 和 unix 的系统调用 read 给搞混了,我上面给的是 read。
fread 返回的是所有被读取的字节数,假如数目不等于请求的字节数,说明有错误发生或者到达文件结束标志(End of File)。
下面写了个读取完整文件的程序将功补过:
/* fread 读取大文件样例 */
#include <stdio.h>
#include <stdlib.h>

int main (char argc, char **argv)
{
char * fileName;
if (argc != 2)
{
printf ("Usage: a.out filename.\n");
exit (1);
}
else { fileName = argv[1];}

FILE * pFile;
long lSize;
char * buffer;

pFile = fopen ( fileName, "rb" );
if (pFile==NULL)
{
perror ("Error opening file");
exit (1);
}

// 获取文件大小.
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
printf("File size = %d\n", lSize);
rewind (pFile);

// 分配内存以包含整个文件
buffer = (char*) malloc (lSize);
if (buffer == NULL)
{
perror ("Couldn't allocate memory\n");
exit (2);
}


// 拷贝文件到缓冲区
long n;
n = fread (buffer,1,lSize,pFile);
printf("Read size = %ld\n", n);

/*** 整个文件被加载到缓冲区. ***/
if (!ferror (pFile))
printf ("No errors while reading.\n");

else perror ("Some errors happened.\n");

// 终止并释放缓冲区
fclose (pFile);
free (buffer);
return 0;
}

$ ./read_complete_file hacker.mpg
File size = 115115008
Read size = 115115008
No errors while reading.
读了几次感觉上还行。文件有 115M 大。
jim900os 2003-09-12
  • 打赏
  • 举报
回复
读取的是声音文件,比7239要大很多。
奇怪的是它还能返回非期望的读取的数字大小。
TianGuangZao 2003-09-12
  • 打赏
  • 举报
回复
fread 一次只能读取一定数目的字节,所以可能多次读,返回每一次读的字节数,7239 应该是最后一次的数目。
每一次读取的数目和 stdio.h 里的定义 BUFSIZ 大小有关,linux 系统:
cat /usr/include/stdio.h

/* Default buffer size. */
#ifndef BUFSIZ
# define BUFSIZ _IO_BUFSIZ
#endif
mme 2003-09-12
  • 打赏
  • 举报
回复
就算有限制,7239这个数字也不对劲啊!!!
晨星 2003-09-12
  • 打赏
  • 举报
回复
是不是你所读取的文件只有7239个字节?

69,373

社区成员

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

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