流操作之缓冲


在copy文件数据中,出现的问题是:内存和硬盘的读写不同步。会导致数据不能及时的更新。

解决的方案:


代码举例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int agrc,char **argv)
{
        int ret=-1;
        //拷贝 源文件(source.c)到目标文件(dst.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;
        buff=malloc(20);//堆 20个字节
        if(NULL==buff){
         perror("malloc buff");
         return -1;
        }
        //读
        //文件,内存地址,读多少内容
        //给读函数提供的信息:读的文件的名称,读到那去,读多少,从哪里开始读。
         //从源文件的默认光标(文件位置处)
        //存放到用户内存里面
    while(1)
    {
        ret= fread(buff,1,20,fp_s);
        if(20>ret)
        {
          //读到source.c文件的尾部
          if(feof(fp_s))
          {
           ret=fwrite(buff,1,ret,fp_d);
           if(0==ret)
           {
            perror("fwrite");
            return -1;
           }
           break;
          }else{
           //出错
           perror("fread");
           return -1;
          }
        }
        //写
        ret=fwrite(buff,1,ret,fp_d);
        if(0==ret){
        perror("fwrite");
        return -1;
        }

//解决方案:fflush(fp_d)通过程序员主动调用这个函数,主动的把库函数分配的内存和我们的硬盘数据进行强制同步

fflush(fp_d);
       
while(1){} //ctrl+c终止程序

//现象:明明在第一次循环中,写进了20字节的数据,但是你查看目标文件时,竟然啥都没看见。这说明这20个字节的数据还在库内存中,还没有写进磁盘。
  }
        free(buff);
        buff=NULL;
        fclose(fp_d);
        fp_d=NULL;
        fclose(fp_s);
        fp_s=NULL;
return 1;
}




你可能感兴趣的:(流操作之缓冲)