今天写了一段具有复制文件的功能的代码,大体功能是这样的,将文件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[1] = {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()了。因为这两个函数读取的是数据流,它们不关心读取的内容。
本文由电子匠人原创,如需转载请注明出处,谢谢。
文章评论(0条评论)
登录后参与讨论