学习文件位置定位函数接口,完成对文件内容的任意位置的访问
#include <stdio.h>
#include <stdlib.h>#include <string.h>
int main(int agrc,char **argv)
{
//新的需求:
//一次性完成数据的传递
//一次性读取源文件
//一次性写入到源文件
int ret=-1;
//总体的需求:拷贝 源文件(source.c)到目标文件(dst.c
//第一步:打开source.c文件
FILE *fp_s=NULL;//源文件流
fp_s=fopen("source.c","r");//只读该文件 r
if(NULL==fp_s)
{
perror("fopen source.c");
return -1;
}
//第二步:打开目的文件
FILE *fp_d=NULL;//目标文件流
fp_d=fopen("dst.c","w");
if(fp_d==NULL)
{
perror("fopen dst.c");
return -1;
}
//第三步:准备内存
char *buff=NULL;
//计算出源文件的大小
//将光标设置到数据的尾部,计算到光标到文件首部的字节数、
//计算出文件的大小
ret=fseek(fp_s,0,SEEK_END);
if(-1==ret)
{
perror("fseek");
return -1;
}
long file_size;
file_size=ftell(fp_s);
//在获取文件的大小后,别忘了,将光标移动到文件的首部。
//文件位置---文件头
ret=fseek(fp_s,0,SEEK_SET);
if(-1==ret)
{
perror("fseek");
return -1;
}
//在这里我们分配的内存就是ret,而不是20个
buff=malloc(file_size);//堆
if(NULL==buff)
{
perror("malloc buff");
return -1;
}
memset(buff,'\0',file_size);//内存每一次完成后清零
//第四步:读、写
//文件,内存地址,读多少内容
//给读函数提供的信息:读的文件的名称,读到那去,读多少,从哪里开始读。
//从源文件的默认光标(文件位置处)
//存放到用户内存里面
ret= fread(buff,1,file_size,fp_s);
//ret的值有三种情况:ret>20,ret<20,ret=0
if(20>ret)
{
//读到source.c文件的尾部
if(feof(fp_s))
{
ret=fwrite(buff,1,ret,fp_d);
if(0==ret)
{
perror("fwrite");
return -1;
}
}
else
{
perror("fseek");
return -1;
}
long file_size;
file_size=ftell(fp_s);
//在获取文件的大小后,别忘了,将光标移动到文件的首部。
//文件位置---文件头
ret=fseek(fp_s,0,SEEK_SET);
if(-1==ret)
{
perror("fseek");
return -1;
}
//在这里我们分配的内存就是ret,而不是20个
buff=malloc(file_size);//堆
if(NULL==buff)
{
perror("malloc buff");
return -1;
}
memset(buff,'\0',file_size);//内存每一次完成后清零
//第四步:读、写
//文件,内存地址,读多少内容
//给读函数提供的信息:读的文件的名称,读到那去,读多少,从哪里开始读。
//从源文件的默认光标(文件位置处)
//存放到用户内存里面
ret= fread(buff,1,file_size,fp_s);
//ret的值有三种情况:ret>20,ret<20,ret=0
if(20>ret)
{
//读到source.c文件的尾部
if(feof(fp_s))
{
ret=fwrite(buff,1,ret,fp_d);
if(0==ret)
{
perror("fwrite");
return -1;
}
}
else
{
//出错
perror("fread");
return -1;
}
}
//写
ret=fwrite(buff,1,ret,fp_d);
if(0==ret)
{
perror("fwrite");
return -1;
}
free(buff);
buff=NULL;
fclose(fp_d);
fp_d=NULL;
fclose(fp_s);
fp_s=NULL;
return 1;
}
哪个错误:没有循环的结构中使用了break