您的位置:首页 > 其它

fread

2015-12-10 20:33 239 查看

[转自 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: