分享

c 复制二进制流

 心不留意外尘 2016-05-18

http://blog.csdn.net/silyvin/article/details/8289047

2012

参考 

feof与EOF 

<转>feof()和EOF用法


fp=fopen("0.exe","rb");     注意 ‘b'

gp=fopen("1.exe","wb");

将fp的文件指针移至末尾

用fseek然后使用ftell(fp)求出文件指针的便宜,实际上就是文件的大小

rewind文件指针malloc这么大的buffer

fread 读取文件内容

fwrite想到第二个文件中

关闭两个文件


  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int main()  
  4. {  
  5.     char *sFile="1.mp3";  
  6.     char *dFile="2.mp3";  
  7.     FILE *sfp,*dfp;  
  8.     if((sfp = fopen(sFile, "rb")) == 0)  
  9.     {  
  10.         printf("源文件打开失败:%s", sFile);  
  11.         return(-1);    
  12.     }  
  13.     if((dfp = fopen(dFile, "wb")) == 0)  
  14.     {  
  15.         printf("目标文件打开失败:"+*dFile);  
  16.         return(-2);  
  17.     }  
  18.       
  19.     fseek(sfp, 0, SEEK_END);  
  20.     int len = ftell(sfp);  
  21.       
  22.     rewind(sfp);  
  23.     void *buffer=(void*)malloc(len);  
  24.     fread(buffer, len, 1, sfp);  
  25.     fwrite(buffer, len, 1, dfp);  
  26.     fclose(sfp);  
  27.     fclose(dfp);  
  28.     return(0);  
  29. }   

另外,也可以挨个读文件的字符实现

  1. #include<stdio.h>  
  2. int main()  
  3. {  
  4.     FILE *fpr = fopen("a.ex","rb");  
  5.     FILE *fpw = fopen("b.ex","wb");  
  6.     int ch = 0;  
  7.     while( (ch = fgetc(fpr)) != -1 )             
  8.         fputc(ch, fpw);  
  9.   
  10.     fclose(fpr);  
  11.     fclose(fpw);  
  12.     return 0;  
  13. }  

注意

1.必须用一个int变量来接收fgetc的返回值,如果用char型变量,则接收到FF再与-1(0xFFFFFFFF)比较,会出现相等的情况,vc将后者隐式转换为char型,考虑以下代码:

  1. #include<stdio.h>  
  2. int main()  
  3. {  
  4.     char a = 0xff;  
  5.     if(0xffffffff == a)  
  6.         printf("ok\n");  
  7.   
  8.     return 0;  
  9. }  

int定义之后,读到FF填入ch后变为0x000000FF,不会出现没有读完就退出循环的情况,当然文本文件的读写无需考虑,因为文件中不会出现FF字符。



2.这段代码会有bug,就是文件读入错误时也会返回EOF

int fgetc( FILE *stream );

fgetc returns the character read as an int or returnEOF to indicate anerror or end of file.


解决方法除了追加ferror判断,还可以用以下代码

  1. #include<stdio.h>  
  2. int main()  
  3. {  
  4.     FILE *fpr = fopen("a.ex","rb");  
  5.     FILE *fpw = fopen("b.ex","wb");  
  6.     char ch = 0;  
  7.     ch = fgetc(fpr);  
  8.     while(!feof(fpr))  
  9.     {  
  10.         fputc(ch, fpw);  
  11.     ch = fgetc(fpr);  
  12.     }  
  13.     fclose(fpr);  
  14.     fclose(fpw);  
  15.     return 0;  
  16. }  

应避免

  1. #include<stdio.h>  
  2. int main()  
  3. {  
  4.     FILE *fpr = fopen("a.ex","rb");  
  5.     FILE *fpw = fopen("b.ex","wb");  
  6.     char ch = 0;  
  7.     while(!feof(fpr))  
  8.     {  
  9.         ch = fgetc(fpr);  
  10.         fputc(ch, fpw);  
  11.     }  
  12.     fclose(fpr);  
  13.     fclose(fpw);  
  14.     return 0;  
  15. }  

这套代码最终会在文件最后加上FF字符,用WinHex查看

原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多