大部分参考自: 文件操作-C语言实现图片的“复制粘贴“过程_一个图像一部分复制到另一个图像中c语言_philippe coutinho的博客-CSDN博客
#define _CRT_SECURE_NO_WARNINGS的作用参考: https://mp.csdn.net/mp_blog/creation/editor/new/129414996
首先我们需要知道图片是一个二进制文件,其次我们就需要通过文件操作的相关接口,对其进行二进制文件的复制。
下面看代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE* fp1 = fopen("D:\\test.jpg", "rb");
FILE* fp2 = fopen("D:\\test2.jpg", "wb");
// FILE* fp1 = fopen("D:\\test.rar", "rb");
// FILE* fp2 = fopen("D:\\test2.rar", "wb");
if (fp1 == NULL) {
perror("fopen");
return 1;
}
if (fp2 == NULL) {
perror("fopen");
return 2;
}
fseek(fp1, 0, SEEK_END); //将指针对二进制文件(库蒂尼奥.jpg)的读取位置放到末端
int i = ftell(fp1); //得到起始偏移量,这里也就是文件大小
rewind(fp1); //将指针对二进制文件(库蒂尼奥.jpg)的读取位置恢复到起始位置
char* p = (char*)malloc(i); //申请与原图片相同大小的动态内存空间
fread(p, 1, i, fp1); //复制
fwrite(p, 1, i, fp2); //粘贴
fclose(fp2);
fclose(fp1); //关闭文件
return 0;
}
我们这里就使用c语言实现了一个简单的图片"复制粘贴"过程。(rar等文件类推实现"复制粘贴"过程)
打开文件:
复制(需要以读取的方式打开二进制文件)
粘贴(需要以写入的方式打开或者创建一个二进制文件)
这里我们使用了fseek,ftell,rewind,fread,fwrite等对文件操作的接口,关于文件的打开与关闭在这里不多说了,我们重点说一说上边所说的对文件属性或者内容进行操作的接口。
fread:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
通过该接口的格式就可以知道,fread是从一个FILE * strem的二进制文件中读取size*count字节数,存入void *ptr这个缓冲区。
fwrite:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
和fread相反,fread是从一个void ptr这个缓冲区中读取sizecount字节数,存入FILE * strem这个二进制文件。
fread和fwrite都是对二进制文件的内容进行操作
下面介绍对文件属性进行操作的接口
ftell:
long int ftell ( FILE * stream );
传出文件指针变量,返回文件指针相对于起始位置的偏移量
举个例子:
这里我们从一个文本文件内容为“1234”字符串进行对ftell应用,得到不断读取一个字符的偏移量对比,并且这里我们简单提一下EOF是读取字符结束,它等于-1.并且这里我们也没有介绍fgetc(从对应文件中得到一个字符)这些接口,大家可以自己了解了解。
fseek:
int fseek ( FILE * stream, long int offset, int origin );根据文件指针的偏移量定位文件指针
举个例子:
rewind:
void rewind ( FILE * stream );
让文件指针的位置回到文件的起始位置
跟与刚才那个例子,改变一下,如图:
这样就回到了,最初的偏移位置,也就是0.
我们本次通过一个应用(图片的复制粘贴),去了解了关于部分对文件操作的接口,关于文件操作的接口有很多,这里我只介绍了一部分,如果读者们感兴趣,可以自行查找了解。
压缩包等文件的复制粘贴过程与本文叙述相同。