c/c++

C基础—文件操作

2018-09-15  本文已影响1人  Peakmain

读取文本文件

void main(){
    // 打开文件 (文件名,模式)mode r(读) w(写) rb(作为二进制读) wb(作为二进制写)
    // FILE *fopen( const char *filename, const char *mode );

    char *file_name = "C:\\Users\\Administrator\\Desktop\\test.txt";
    FILE * file=fopen(file_name, "r");
    if (!file){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    char buffer[10];
    //缓冲区buffer,长度10,文件指针
    while (fgets(buffer, 10, file)){
        printf("%s", buffer);
    };
    //关闭文件
    fclose(file);
    getchar();
}

文件的写入

void main(){
    char* fileName = "C:\\Users\\Administrator\\Desktop\\test.txt";
    FILE *file = fopen(fileName, "w");
    if (!file){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    //会把原来的覆盖掉
    fputs("我是威廉", file);
    // 关闭文件
    fclose(file);
    getchar();
}

文件的拷贝

//文件的拷贝,当做二进制文件操作

void main(){
    char *file_name = "C:\\Users\\Administrator\\Desktop\\image.jpg";
    char *fileCopyName = "C:\\Users\\Administrator\\Desktop\\image_copy.jpg";
    FILE * file = fopen(file_name, "rb");
    FILE * file_copy = fopen(fileCopyName, "wb");
    if (!file||!file_copy){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    // size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
    int buffer[512];
    int len;
    printf("%d", sizeof buffer);
    while ((len=fread(buffer, sizeof(int), 512, file))!=0){
        fwrite(buffer, sizeof(int), len, file_copy);
    }
    fclose(file);
    fclose(file_copy);
    getchar();
}

获取文件的大小

//获取文件的大小
void main(){
    char *file_name = "C:\\Users\\Administrator\\Desktop\\image.jpg";
    FILE * file = fopen(file_name, "rb");
    if (!file){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    //没有一个函数是可以直接拿文件的大小
    //将文件的指针移动到最后,然后再计算偏移量
    // 三个参数  SEEK_SET(开头), SEEK_CUR(当前), SEEK_END(移动到最后)
    fseek(file, 0, SEEK_END);
    // 计算偏移的位置,ftell 从 0 开始统计到当前(SEEK_END)
    long file_size = ftell(file);
    printf("文件大小:%ld", file_size);
    fclose(file);//953925
    getchar();
}

文件加密

//文件加密
//图片服务器(使用第三方的),为防止图片泄密,图片进行加密
void main(){

    char *file_name = "C:\\Users\\Administrator\\Desktop\\image.jpg";
    char *fileEncrpyName = "C:\\Users\\Administrator\\Desktop\\image_en.jpg";
    FILE * file = fopen(file_name, "rb");
    FILE * file_encrpy = fopen(fileEncrpyName, "wb");
    if (!file || !file_encrpy){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    //思路:把每一个字节都拿出来,对每一个字节都处理或者把某部分字节拿出来,进行处理
    // 10^5 异或  加密过程 
    //  1010     10
    // ^0101      5
    //  1111  加密 

    // 解密 同样的去异或 5 
    //  1111     
    // ^0101      5
    //  1010    解密后 10
    int c;
    while ((c = fgetc(file)) != EOF){
        fputc(c ^ 5, file_encrpy);
    }
    getchar();

}

文件解密

void main(){
    char *fileEnName = "C:\\Users\\Administrator\\Desktop\\image_en.jpg";
    char *fileDeName = "C:\\Users\\Administrator\\Desktop\\image_dn.jpg";
    FILE * file = fopen(fileEnName, "rb");
    FILE * file_decrpy = fopen(fileDeName, "wb");
    if (!file || !file_decrpy){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    //思路:把每一个字节都拿出来,对每一个字节都处理或者把某部分字节拿出来,进行处理
    // 10^5 异或  加密过程 
    //  1010     10
    // ^0101      5
    //  1111  加密 

    // 解密 同样的去异或 5 
    //  1111     
    // ^0101      5
    //  1010    解密后 10
    int c;
    while ((c = fgetc(file)) != EOF){
        fputc(c ^ 5, file_decrpy);
    }
    getchar();
}

字符串密码进行加密

void main(){
    char *file_name = "C:\\Users\\Administrator\\Desktop\\image.jpg";
    char *fileEncrpyName = "C:\\Users\\Administrator\\Desktop\\image_en.jpg";
    FILE * file = fopen(file_name, "rb");
    FILE * file_decrpy = fopen(fileEncrpyName, "wb");
    if (!file || !file_decrpy){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    //思路:把每一个字节都拿出来,对每一个字节都处理或者把某部分字节拿出来,进行处理
    // 10^5 异或  加密过程 
    //  1010     10
    // ^0101      5
    //  1111  加密 

    // 解密 同样的去异或 5 
    //  1111     
    // ^0101      5
    //  1010    解密后 10
    int c;
    char* password = "123456";//轮流进行异或操作
    int index=0;
    int pass_len = strlen(password);
    while ((c = fgetc(file)) != EOF){
        fputc(c ^password[index%pass_len], file_decrpy);
        index++;
    }
    getchar();
}

对字符串密码进行解密

//对字符串密码进行解密
void main(){
    char *file_name = "C:\\Users\\Administrator\\Desktop\\image_en.jpg";
    char *fileEncrpyName = "C:\\Users\\Administrator\\Desktop\\image_dn.jpg";
    FILE * file = fopen(file_name, "rb");
    FILE * file_decrpy = fopen(fileEncrpyName, "wb");
    if (!file || !file_decrpy){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    //思路:把每一个字节都拿出来,对每一个字节都处理或者把某部分字节拿出来,进行处理
    // 10^5 异或  加密过程 
    //  1010     10
    // ^0101      5
    //  1111  加密 

    // 解密 同样的去异或 5 
    //  1111     
    // ^0101      5
    //  1010    解密后 10
    int c;
    char* password = "123456";//轮流进行异或操作
    int index = 0;
    int pass_len = strlen(password);
    while ((c = fgetc(file)) != EOF){
        fputc(c ^password[index%pass_len], file_decrpy);
        index++;
    }
    getchar();
}

文件的切割

int getFileSize(char* fileName){
    FILE * file = fopen(fileName, "rb");
    if (!file){
        exit(0);// 退出程序
    }
    //没有一个函数是可以直接拿文件的大小
    //将文件的指针移动到最后,然后再计算偏移量
    // 三个参数  SEEK_SET(开头), SEEK_CUR(当前), SEEK_END(移动到最后)
    fseek(file, 0, SEEK_END);
    // 计算偏移的位置,ftell 从 0 开始统计到当前(SEEK_END)
    long file_size = ftell(file);
    printf("文件大小:%ld", file_size);
    fclose(file);//953925
    return file_size;
}
// 文件的切割,思路类似于断点下载
void main(){
    char *fileName = "C:\\Users\\Administrator\\Desktop\\image.jpg";
    FILE* file = fopen(fileName, "rb");
    //获取文件的大小
    int file_size = getFileSize(fileName);
    // 定义 切多少,计算大小,指定文件名
    int file_number = 3;
    // 二维数组,char[]== char*
    // image_0.jpg
    // image_1.jpg
    // image_2.jpg
    // 一位数组:char* file_name
    // char* 
    char **file_names = (char**)malloc(sizeof(char*)*file_number);
    //每一段的大小
    int preFileSize = file_size / file_number;
    //进行复制
    int i = 0;
    for (; i < 3; i++){
        file_names[i] = (char*)malloc(sizeof(char)* 100);// '\0'
        sprintf(file_names[i], "C:\\Users\\Administrator\\Desktop\\image_%d.jpg", i);
        printf("%s\n", file_names[i]);
    }
    i = 0;
    for (; i < file_number; i++){
        // 从源文件中往切割文件写入数据
        FILE* cur_file = fopen(file_names[i], "wb");
            //写多少
        int start = i*preFileSize;
        int end = (i + 1)*preFileSize;
        for (int j = start; j < end; j++){
            fputc(fgetc(file), cur_file);
        }
        fclose(cur_file);
        free(file_names[i]);
    }
    fclose(file);
    free(file_names);
    getchar();
}

文件的合并

int getFileSize(char* fileName){
    FILE * file = fopen(fileName, "rb");
    if (!file){
        exit(0);// 退出程序
    }
    //没有一个函数是可以直接拿文件的大小
    //将文件的指针移动到最后,然后再计算偏移量
    // 三个参数  SEEK_SET(开头), SEEK_CUR(当前), SEEK_END(移动到最后)
    fseek(file, 0, SEEK_END);
    // 计算偏移的位置,ftell 从 0 开始统计到当前(SEEK_END)
    long file_size = ftell(file);
    printf("文件大小:%ld", file_size);
    fclose(file);//953925
    return file_size;
}
void main(){
    char *fileName0 = "C:\\Users\\Administrator\\Desktop\\image_0.jpg";
    char *fileName1 = "C:\\Users\\Administrator\\Desktop\\image_1.jpg";
    char *fileName2 = "C:\\Users\\Administrator\\Desktop\\image_2.jpg";
    char *fileName = "C:\\Users\\Administrator\\Desktop\\image_bc.jpg";
    FILE* file0 = fopen(fileName0, "rb");
    FILE* file1 = fopen(fileName1, "rb");
    FILE* file2 = fopen(fileName2, "rb");
    FILE* file = fopen(fileName, "wb");
    //获取文件的大小
    int file_size0 = getFileSize(fileName0);//317975
    int file_size1 = getFileSize(fileName1);
    int file_size2 = getFileSize(fileName2);
    // 定义 切多少,计算大小,指定文件名
    //进行复制

    int i = 0;
    for (int start = 0; i < file_size0; i++){
        fputc(fgetc(file0), file);
    }
    for (int j = file_size0; j < file_size0 + file_size1; j++){
        fputc(fgetc(file1), file);
    }
    for (int z = file_size0 + file_size1; z < file_size0 + file_size1 + file_size2; z++){
        fputc(fgetc(file2), file);
    }
    getchar();
}
上一篇 下一篇

猜你喜欢

热点阅读