【linux--菜鸟学习之路】fread和fwrite
fread
函数名: fread
功 能: 从一个流中读数据
用 法: int fread(void *ptr, int size, int nitems, FILE *stream);
参 数:用于接收数据的地址(ptr)
单个元素的大小(size)
元素个数(nitems)
提供数据的文件指针(stream)
返回值:成功读取的元素个数
fwrite函数
1.函数功能
用来读写一个数据块。
2.一般调用形式
fwrite(buffer,size,count,fp);
3.说明
(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针
个人理解 -流:相当于 size 的大小(不一定对);如果定义size=128,那么这个数据流的大小就是128为基本单位;
#include "stdio.h"
//#include "unistd.h"
int main(int argc, char *argv[])
{
FILE *src_fp , *des_fp;//定义指向源文件和目标文件的指针
int read_ret;
char read_buf[128]={0};
//char buf[]="hello linux";
if(argc<3)
{
printf("src ? des? \n ");
return -1;
}
src_fp=fopen(argv[1],"r");
if(src_fp==NULL)
{
printf("open src %s fail\n",argv[1]);
return -2;
}
des_fp=fopen(argv[2],"w");
if(des_fp==NULL)
{
printf("open des %s fail\n",argv[2]);
return -3;
}
while(1) //重点在这里
{
read_ret=fread(read_buf,1,128,src_fp); //定义了128个字节大小的文件流
printf("read_ret=%d ",read_ret);fwrite(read_buf,1,read_ret,des_fp); //写到目标文件中
if(read_ret < 128)
{
printf("read file %s end \n",argv[1]);
break;
}
// printf("begin write\n");
// fwrite(read_buf,1,read_ret,des_fp);
}
fclose(src_fp);
fclose(des_fp);
return 0;
}运行后将a.c内容复制到b.c,结果如下:
接下来将代码修改:
while(1) //重点在这里
{
read_ret=fread(read_buf,1,128,src_fp); //定义了128个字节大小的文件流
printf("read_ret=%d ",read_ret);// fwrite(read_buf,1,read_ret,des_fp); //写到目标文件中
if(read_ret < 128)
{
printf("read file %s end \n",argv[1]);
break;
}
printf("begin write\n");
fwrite(read_buf,1,read_ret,des_fp); //将写操作,修改到这里
}运行结果如下:
如果觉得不想看 ,可以看下面的:
可以看出,a.c和b.c的内容不一样,具体原因是:
这里的最后一个71,这里因为小于128,所以没有写入到b.c里去;b.c比a.c正好小455-384=71;
(这也是我认为size就是流的大小,因为read_ret返回实际读到的大小,也就是他是按照这个size的大小来一次性读写的)