C语言文件拷贝-四种方式

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言文件拷贝-四种方式相关的知识,希望对你有一定的参考价值。

利用文件IO的方式,实现2个文件的拷贝

int copy_by_fileIO(const char *dest_file_name, const char *src_file_name) {//OK
    int fd1 = open(dest_file_name,O_WRONLY|S_IWOTH);
    if(fd1 == -1) {
        perror("fd1:");
        return -1;
    }
    int fd2 = open(src_file_name,O_RDONLY|S_IROTH);
    if(fd2 == -1) {
        perror("fd2:");
        return -1;
    }
    char *buffer = (char *)malloc(2 * sizeof(char));
    int ans = 0;
    int k;
    do{
        k = read(fd2,buffer,1);
        memset(buffer,0,sizeof(buffer));
        write(fd1,buffer,1);
        //printf("k = %d\\tbuffer = %d\\t%c\\n",k,buffer[0]);
        ans++;
    }while(k > 0);
    close(fd1);
    close(fd2);
    return ans;
}

利用标准IO的字符IO,实现2个文件的字节拷贝

int copy_by_char(const char *dest_file_name, const char *src_file_name) {//OK
    FILE *fp1 = fopen(dest_file_name,"w");
    FILE *fp2 = fopen(src_file_name,"r");
    if(fp1 == NULL) {
        perror("fp1:");
        return -1;
    }
    if(fp2 == NULL) {
        perror("fp2:");
        return -1;
    }
    char buffer = fgetc(fp2);
    int cnt = 0;
    while(!feof(fp2)) {
        cnt++;
        fputc(buffer,fp1);
        buffer = fgetc(fp2);
    }
    fclose(fp1);
    fclose(fp2);
}

利用标准IO的行IO,实现2个文件的按行拷贝

int copy_by_line(const char *dest_file_name, const char *src_file_name) { //ok
    FILE *fp1 = fopen(dest_file_name,"w");
    FILE *fp2 = fopen(src_file_name,"r");
    if(fp1 == NULL) {
        perror("fp1:");
        return -1;
    }
    if(fp2 == NULL) {
        perror("fp2:");
        return -1;
    }
    char * buffer = (char *)malloc(sizeof(char) * 101);
    int cnt = 0;
    while(fgets(buffer,100,fp2)) {
        fputs(buffer,fp1);
        cnt++;
    }
    free(buffer);
    fclose(fp1);
    fclose(fp2);
    return cnt;//返回的是读取的行数
}

利用标准IO的块IO,实现2个文件的块拷贝

int copy_by_block(const char *dest_file_name, const char *src_file_name) {//ok
    FILE *fp1 = fopen(dest_file_name,"w");
    FILE *fp2 = fopen(src_file_name,"r");
    if(fp1 == NULL) {
        perror("fp1:");
        return -1;
    }
    if(fp2 == NULL) {
        perror("fp2:");
        return -1;
    }
    void *buffer = (void *)malloc(2);
    int cnt = 0;
    while(1) {
        int op = fread(buffer,1,1,fp2);
        if(op <= 0) break;
        fwrite(buffer,1,1,fp1);
        cnt++;
    }
    free(buffer);
    fclose(fp1);
    fclose(fp2);
    return cnt;
}

汇总

//
// Created by Mangata on 2021/10/5.
/*
 * 需求描述:分别使用文件IO,标准字符、标准行、标准块IO实现文本文件的拷贝功能
 * 思考,如果是普通的图片、视频文件,上述拷贝哪些可以用,哪些不可以用
 * */
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/*
 * 利用文件IO的方式,实现2个文件的拷贝
 * */
int copy_by_fileIO(const char *dest_file_name, const char *src_file_name) {//OK
    int fd1 = open(dest_file_name,O_WRONLY|S_IWOTH);
    if(fd1 == -1) {
        perror("fd1:");
        return -1;
    }
    int fd2 = open(src_file_name,O_RDONLY|S_IROTH);
    if(fd2 == -1) {
        perror("fd2:");
        return -1;
    }
    char *buffer = (char *)malloc(2 * sizeof(char));
    int ans = 0;
    int k;
    do{
        k = read(fd2,buffer,1);
        memset(buffer,0,sizeof(buffer));
        write(fd1,buffer,1);
        //printf("k = %d\\tbuffer = %d\\t%c\\n",k,buffer[0]);
        ans++;
    }while(k > 0);
    close(fd1);
    close(fd2);
    return ans;
}

/*
 * 利用标准IO的字符IO,实现2个文件的字节拷贝
 * */
int copy_by_char(const char *dest_file_name, const char *src_file_name) {//OK
    FILE *fp1 = fopen(dest_file_name,"w");
    FILE *fp2 = fopen(src_file_name,"r");
    if(fp1 == NULL) {
        perror("fp1:");
        return -1;
    }
    if(fp2 == NULL) {
        perror("fp2:");
        return -1;
    }
    char buffer = fgetc(fp2);
    int cnt = 0;
    while(!feof(fp2)) {
        cnt++;
        fputc(buffer,fp1);
        buffer = fgetc(fp2);
    }
    fclose(fp1);
    fclose(fp2);
}

/*
 * 利用标准IO的行IO,实现2个文件的按行拷贝
 * */
int copy_by_line(const char *dest_file_name, const char *src_file_name) { //ok
    FILE *fp1 = fopen(dest_file_name,"w");
    FILE *fp2 = fopen(src_file_name,"r");
    if(fp1 == NULL) {
        perror("fp1:");
        return -1;
    }
    if(fp2 == NULL) {
        perror("fp2:");
        return -1;
    }
    char * buffer = (char *)malloc(sizeof(char) * 101);
    int cnt = 0;
    while(fgets(buffer,100,fp2)) {
        fputs(buffer,fp1);
        cnt++;
    }
    free(buffer);
    fclose(fp1);
    fclose(fp2);
    return cnt;//返回的是读取的行数
}

/*
 * 利用标准IO的块IO,实现2个文件的块拷贝
 * */
int copy_by_block(const char *dest_file_name, const char *src_file_name) {//ok
    FILE *fp1 = fopen(dest_file_name,"w");
    FILE *fp2 = fopen(src_file_name,"r");
    if(fp1 == NULL) {
        perror("fp1:");
        return -1;
    }
    if(fp2 == NULL) {
        perror("fp2:");
        return -1;
    }
    void *buffer = (void *)malloc(2);
    int cnt = 0;
    while(1) {
        int op = fread(buffer,1,1,fp2);
        if(op <= 0) break;
        fwrite(buffer,1,1,fp1);
        cnt++;
    }
    free(buffer);
    fclose(fp1);
    fclose(fp2);
    return cnt;
}

int main() {
    char *src_file_path = "/etc/profile";
    char *dest_file_path = "/tmp/test_profile";
    int cnt = copy_by_fileIO(dest_file_path,src_file_path);
    printf("cnt = %d\\n",cnt);
    return 0;
}


以上是关于C语言文件拷贝-四种方式的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select 语句的用法

C语言如何实现拷贝图片?几行代码即可搞定

这四种对象属性拷贝方式,你都知道吗?

求汇编语言将一个内存块拷贝到指定地址的代码

文件拷贝,用C语言实现命令行式的COPY功能

C语言函数编写:文件复制