热度 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()了。 因为这两个函数读取的是数据流,它们不关心读取的内容。 本文由电子匠人原创,如需转载请注明出处,谢谢。