fread

[转自 http://blog.csdn.net/foxliucong/article/details/4736956和http://blog.csdn.net/abclixu123/article/details/8284680 ]

1 fread(从文件流读取数据)  

     表头文件  #include<stdio.h>
     定义函数  size_t fread(void * ptr,size_t size,size_t count,FILE * stream);
 
     函数说明  fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字节数以参数size*count来决定。
    Fread()会返回实际读取到的count数目,如果此值比参数count来得小,则代表可能读到了文件尾了或者有错误发生(前者几率大),这时必须用feof()或ferror()来决定发生什么情况。
 

    返回值  返回实际读取到的count数目。fread返回的不是字节数。

2 正反举例

    正确的例子实现文件内容的拷贝。

   

#include <stdio.h>

#define BUFFER_SIZE  1024

int main(int argc, char *argv[])
{
	FILE *from_fp, *to_fp;
	int bytes_read, bytes_write;
	char *ptr;
	char buffer[BUFFER_SIZE];

	if(argc != 3)		//参数包括源文件名与目标文件名
	{
		printf("Input failed!\n");
		return 1;
	}

	if( (from_fp = fopen(argv[1],"r")) == NULL )	//以只读方式打开源文件名
	{
		printf("File is not exist\n");
		return 1;
	}
	
	if((to_fp = fopen(argv[2],"w+")) == NULL)	   //打开第二个文件
	{
		printf("Open file failed!\n");	
		return 1;
	}

	while(bytes_read = fread(buffer, 1, BUFFER_SIZE, from_fp))	//读取BUFFSIZE大小字节
	{
		if(bytes_read > 0)			//读取有效数据
		{
			ptr = buffer;
			while(bytes_write = fwrite(ptr, 1, bytes_read, to_fp))	//写数据到目标文件
			{
				if(bytes_write == bytes_read)			//写完	
					break;
				else if(bytes_write > 0)			//未写完
				{
					ptr += bytes_write;
					bytes_read -= bytes_write;
				}
			}
			if(bytes_write == 0)			//写错误
				break;
		}
	}
	
	fclose(from_fp);
	fclose(to_fp);

	return 0;
}

    但如果按如下调用则会出错

while(bytes_read = fread(buffer, BUFFER_SIZE, 1,from_fp))
while(bytes_write = fwrite(ptr, bytes_read, 1, to_fp))
    这里第三个参数为1,换句话说,也就是说要读取1个元素,此元素中包含BUFFER_SIZE个字节,因为我的文件不满足这个条件,这样的元素值不存在。于是返回的值为0,这也是为什么我的文件数据没有复制到另一个文件的原因了,因为根本就没有执行这个循环中的代码。

3 feof和 ferror 更完整的实现

    另外一个需要注意到的问题是fread函数不能区分文件是否结尾和出错两种情况。所以必须使用ferror()和feof()函数来确定到底是哪种情况,所以关于文件复制还有下面另一种写法。

   

#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE  1024

int main(int argc, char *argv[])
{
	FILE *from_fp, *to_fp;
	//int bytes_read, bytes_write;
	long file_len = 0;
	char buffer[BUFFER_SIZE];

	if(argc != 3)		//参数包括源文件名与目标文件名
	{
		printf("Input failed!\n");
		return 1;
	}

	if( (from_fp = fopen(argv[1],"r")) == NULL )	//以只读方式打开源文件名
	{
		printf("File is not exist\n");
		return 1;
	}
	
	if((to_fp = fopen(argv[2],"w+")) == NULL)	   //打开第二个文件
	{
		printf("Open file failed!\n");	
		return 1;
	}
	
	fseek(from_fp, 0L, SEEK_END);		//定位文件指针到尾部
	file_len = ftell(from_fp);			//获得文件长度
	fseek(from_fp, 0L, SEEK_SET);		//定位文件指针到开始处

	while(!feof(from_fp))				//判断文件是否结束
	{
		fread(buffer, BUFFER_SIZE, 1, from_fp);
		if(BUFFER_SIZE > file_len)				//缓冲区长度大于文件长度
			fwrite(buffer, file_len, 1, to_fp);
		else								
		{
			fwrite(buffer, BUFFER_SIZE, 1, to_fp);
			file_len -= BUFFER_SIZE;
		}
		bzero(buffer,BUFFER_SIZE);		//清零缓冲区
	}

	fclose(from_fp);
	fclose(to_fp);

	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值