zoukankan      html  css  js  c++  java
  • c 复制二进制流

    参考 

    feof与EOF 

    <转>feof()和EOF用法


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

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

    将fp的文件指针移至末尾

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

    rewind文件指针malloc这么大的buffer

    fread 读取文件内容

    fwrite想到第二个文件中

    关闭两个文件


    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    	char *sFile="1.mp3";
    	char *dFile="2.mp3";
    	FILE *sfp,*dfp;
    	if((sfp = fopen(sFile, "rb")) == 0)
    	{
    		printf("源文件打开失败:%s", sFile);
    		return(-1);  
    	}
    	if((dfp = fopen(dFile, "wb")) == 0)
    	{
    		printf("目标文件打开失败:"+*dFile);
    		return(-2);
    	}
    	
    	fseek(sfp, 0, SEEK_END);
    	int len = ftell(sfp);
    	
    	rewind(sfp);
    	void *buffer=(void*)malloc(len);
    	fread(buffer, len, 1, sfp);
    	fwrite(buffer, len, 1, dfp);
    	fclose(sfp);
    	fclose(dfp);
    	return(0);
    } 

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

    #include<stdio.h>
    int main()
    {
        FILE *fpr = fopen("a.ex","rb");
        FILE *fpw = fopen("b.ex","wb");
        int ch = 0;
        while( (ch = fgetc(fpr)) != -1 )           
            fputc(ch, fpw);
    
        fclose(fpr);
        fclose(fpw);
        return 0;
    }

    注意

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

    #include<stdio.h>
    int main()
    {
        char a = 0xff;
    	if(0xffffffff == a)
    		printf("ok\n");
    
        return 0;
    }

    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判断,还可以用以下代码

    #include<stdio.h>
    int main()
    {
        FILE *fpr = fopen("a.ex","rb");
        FILE *fpw = fopen("b.ex","wb");
        char ch = 0;
        ch = fgetc(fpr);
        while(!feof(fpr))
        {
            fputc(ch, fpw);
    	ch = fgetc(fpr);
        }
        fclose(fpr);
        fclose(fpw);
        return 0;
    }

    应避免

    #include<stdio.h>
    int main()
    {
        FILE *fpr = fopen("a.ex","rb");
        FILE *fpw = fopen("b.ex","wb");
        char ch = 0;
        while(!feof(fpr))
    	{
    		ch = fgetc(fpr);
            fputc(ch, fpw);
    	}
        fclose(fpr);
        fclose(fpw);
        return 0;
    }

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

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


  • 相关阅读:
    idea添加自定义插件仓库 灵狐插件、阿里代码规约插件安装&idea插件推荐
    常用版本名称含义:SNAPSHOT->alpha->beta->release->GA等
    Ambari Centos7离线安装教程详细指导(参考)
    JDK11变化详解&JDK8升级JDK11详细指南
    idea jdk8、jdk9、jdk11、jdk12并自由切换
    idea java EclipseFormatter代码格式化模板
    java基础对象浅复制和深复制(基础知识)
    斐讯路由器L(联)B(壁)K-码兑换包安全下车通道(图文教程)
    SipDroid +miniSIPServer搭建SIP局域网语音通话(一)
    Android Studio 找不到EventBus/ButterKnife等第三方包解决方案
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106902.html
Copyright © 2011-2022 走看看