C/C++编程:文件输入输出流

1060 篇文章 296 订阅

应用

压缩文件的复制

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值