应用
压缩文件的复制
C版本
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1024 * 3
int main () {
long total = 0, length = 0;
FILE* src = NULL, *dst = NULL;
char * buffer;
// “rb+” 读写打开一个二进制文件
// wb+ 打开或建立一个二进制文件
// -用”w”打开文件时,若文件不存在,则创建,若存在,则将其删除,再创建一个文件
src = fopen("/home/oceanstar/CLionProjects/acl_redis.tar.gz", "rt+");
dst = fopen("/home/oceanstar/copy.tar.gz", "wb+");
if(src == NULL || dst == NULL){
perror("fopen error");
return -1;
}
buffer = (char*) malloc (sizeof(char)*MAXLINE);
if (buffer == NULL) {
fputs ("Memory error",stderr);
exit (2);
}
fseek(src,0L,SEEK_END);
length=ftell(src);
rewind(src);
printf("src has [%ld] characters...", length);
while (true){
fseek(src,total,SEEK_SET);
int t = fread(buffer, 1, MAXLINE, src);
fwrite (buffer ,1, t, dst);
total = total + t;
if(total == length){
break;
}
}
fclose(src);
fclose(dst);
free(buffer);
return 0;
}
C++版本
// copy a file using file stream buffers
#include <fstream> // std::filebuf, std::fstream
#include <cstdio> // EOF
#include <iostream>
#define MAXLINE 1024 * 3
int main () {
long total = 0, length = 0;
char * buffer = new char [MAXLINE];
std::fstream src,dest;
src.open ("/home/oceanstar/CLionProjects/acl_redis.tar.gz", std::fstream::in | std::fstream::out | std::fstream::binary);
dest.open ("/home/oceanstar/copy.tar.gz", std::fstream::out); // out: 文件不存在就创建
src.seekg (0, std::fstream::end);
length = src.tellg();
std::cout << "src has [ " << length << " ]characters... ";
while (true){
src.seekg(total, std::fstream::beg);
src.read (buffer,MAXLINE);
dest.write(buffer, src.gcount());
total = total + src.gcount();
if(total == length){
break;
} // 34729142
}
dest.close();
src.close();
delete [] buffer;
return 0;
}