tag 标签: 文件拷贝

相关博文
  • 热度 10
    2014-3-16 01:54
    2248 次阅读|
    0 个评论
    今天写了一段具有复制文件的功能的代码,大体功能是这样的,将文件a的内容复制到b,这段代码是通用的,也就是说,文件a无论是任何格式,都要保证复制成功,代码如下(忽略容错部分): void CopyFile(void) {      FILE* f1 = fopen("1.jpg", "rb");  // 以二进制形式读      FILE* f2 = fopen("2.jpg", "wb");  // 以二进制形式写      char CharTemp = getc(f1);      while(EOF != CharTemp)      {           putc(CharTemp,f2);           CharTemp = getc(f1);      }      fclose(f1);      fclose(f2); }   后来在测试的时候发现,如果拷贝的文件是txt格式,能够拷贝成功,如果是其他格式,比如jpg,就会失败,后来改为如代码(忽略容错部分):   void CopyFile(void) {      char pBuffer = {0};      FILE* f1 = fopen("1.jpg", "rb");  // 以二进制形式读      FILE* f2 = fopen("2.jpg", "wb");  // 以二进制形式写      while (!feof(f1))      {           fread(pBuffer, 1, 1, f1);   // 每次读1个字节           fwrite(pBuffer, 1, 1, f2);  // 每次写1个字节      }      fclose(f1);      fclose(f2); }   后来查了一下资料,然后仔细总结了一下,原因如下: fgetc()和 fputc()都是读取和写入字符char的函数。这里的字符可以看作是 ASCII码.如果读文本,是没有任何问题的,但是图像文件里面是字符吗? 不是! 所以出现了这样的问题。 图像文件格式比较复杂,这方面知识很多。就单单JPEG格式来说,它是一个专门的专家组在定义这个格式。 简单的理解,图像文件中存储的是描述部分和数据部分。描述部分可能是字符。但是数据部分不是字符。 要拷贝图像,就不能fgetc()/fputc()了,可以用fread()/fwrite()了。 因为这两个函数读取的是数据流,它们不关心读取的内容。 本文由电子匠人原创,如需转载请注明出处,谢谢。