这一段代码,展示的是写一个指令,可以拷贝一个文件中的内容到另一个文件中。
FILE* fpIn = fopen("argv[1]", "r"); assert(fpIn != NULL); FILE* fpOut = fopen("argv[2]", "w"); assert(fpOut != NULL); char buffer[256] = { 0 }; char* res = fgets(buffer, 256, fpIn); while (res != NULL) { fputs(buffer, fpOut); res = fgets(buffer, 256, fpIn); } fclose(fpIn); fclose(fpOut); printf("拷贝完成……");
这里面有一些函数属于文件的操作函数。
FILEfp 是定义一个文件指针,在编译器内部,文件的文件名,当前状态,位置等信息被保存在一个名为FILE结构体中。
fopen打开文件的函数,返回一个指针指向打开的文件,指针的类型是FILE类型的,如果错误那就返回空,可以用prror,strerror返回错误信息。第一个参数是const char类型的文件名,第二个参数是打开模式,打开模式有r只读,w只写,a追加,rb二进制文件只读,wb二进制文件只写等。
fclose关闭指针指向的文件。
fgets,char *fgets(char *str, int n, FILE *stream),在代码中看,是从fpIn中读取一行,送到buffer中,fputs把数据从buffer写到fpOut中。
这段代码只能拷贝文本文件,因为它是按照字符的方式进行拷贝的。如果是其他格式的文件比如图片。
拷贝部分可以这样做
char buffer[256] = { 0 }; size_t count = fread(buffer, sizeof(char), 256, fpIn); while (count != 0) { fwrite(buffer, sizeof(char), count, fpOut); count = fread(buffer, sizeof(char), 256, fpIn);
这里面有两个函数,fwrite二进制输出,在代码中理解它的使用,第一个参数表示从哪儿写出去,第二个表示每个元素的大小,第三个写多少个最后写到哪里,fread同理,是一个二进制输入函数。
这两段代码中的函数都是文件的顺序读写,文件还有随机读写的形式,没有写出好的例子,先记一下这几个函数
fseek int fseek(FILE* stream,long int offset,int origin)
根据文件指针的位置和偏移量来定位文件,第一个参数指针用来定位文件,第二个参数是偏移量,第三个参数表示相对位置,相对位置可以相对于当前位置,文件末尾,或者是文件起始位置。
fteel,返回文件相对于起始位置的偏移量。传入定位文件的指针。rewind函数,让文件指针的位置回到文件的起始位置。也传入指针。
还有一个feof函数,用于当文件读取结束的时候判断是因为读取失败了还是真正到文件末尾结束了。