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