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)。


原文地址:https://www.cnblogs.com/silyvin/p/9106902.html