C语言文件操作

16 篇文章 0 订阅
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//内容一:读取文件-文本文件
// int main(){
//     //文件的路径
//     //Windows下:F:\\test.txt
//     //Mac下:/Users/yangshaohong/Desktop/test.txt
//     char file_path[] = "/Users/yangshaohong/Desktop/test.txt";
//     //打开文件(和Java类似)
//     //参数一:文件路径
//     //参数二:文件权限(例如:r代表读  w代表写  rw读写)
//     //返回值:文件指针
//     FILE *file = fopen(file_path,"r");
//     //判断一下文件是否为空(Java里面  obj == null)
//     if(file == NULL){
//         printf("当前文件不存在.....");
//         return 0;
//     }
//     //存在-读取内容
//     //定义缓冲区(C++、Java、OC、Swift、ASP.NET等等......)
//     char buffer[100];
//     //参数一:缓冲区
//     //参数二:每次读取长度(注意:不能够超过缓冲区的大小)
//     //参数三:源文件
//     //返回值:字符指针(如果返回'\0',否则存在)
//     while(fgets(buffer,100,file)){
//         //打印
//         //注意:不需要加换行符
//         printf("%s",buffer);
//     }
// fclose(file)
//     getchar();
//     return 0;
// }

//内容二:写入文件-文本文件
// int main(){
//     //写文件的路径
//     char file_path[] = "/Users/yangshaohong/Desktop/test_new.txt";
//     //首先需要打开文件
//     FILE *file = fopen(file_path,"w");
//     //字符串(字符数组)
//     char content[] = "I have a Dream.";
//     //参数一:写入的内容
//     //参数二:源文件
//     fputs(content,file);
//     //关闭流
//     fclose(file);
//     getchar();
//     return 0;
// }

//内容三:二进制文件读写
//计算机中分为了二进制文件和文本文件(逻辑上面区分)
//对于计算机本身而言都是二进制
//二进制文件和文本文件区别?
//答:就在于换行符不一样
//文本文件:
//写入文件:每当遇到'\n',会将其转成'\r\n'(回车换行)
//读取文本:每当遇到'\r\n',就会将其转成'\n'
//二进制文件:复制
// int main(){
//     //将文件的内容写到另外一个文件中(边读边写)
//     //定义源文件
//     char old_file_path[] = "/Users/yangshaohong/Desktop/test.txt";
//     //定义目标文件
//     char new_file_path[] = "/Users/yangshaohong/Desktop/test_new.txt";
//     //打开源文件
//     //rb:代表读取二进制文件
//     FILE *old_file_p = fopen(old_file_path,"rb");
//     //打开目标文件
//     //wb:代表写入二进制文件
//     FILE *new_file_p = fopen(new_file_path,"wb");

//     //边读边写
//     //定义缓冲区
//     int buffer[50];
//     //记得我们在Java中读取文件的时候,我们是不是要定义一个读取多长
//     //C语言和Java一样
//     int len = 0;
//     //参数一:缓冲区
//     //参数二:单位大小
//     //参数三:每次读取的长度
//     //参数四:源文件
//     while((len = fread(buffer,sizeof(int),50,old_file_p))!=0){
//         //写入到目标文件
//         //参数一:缓冲区
//         //参数二:单位大小
//         //参数三:每次读取的长度
//         //参数四:目标文件
//         //例如:文件大小100,缓冲区60,第一次读取:len = 60  第二次:len = 40
//         fwrite(buffer,sizeof(int),len,new_file_p);
//     }

//     //关闭流
//     fclose(new_file_p);
//     fclose(old_file_p);
//     getchar();

//     return 0;
// }

//内容四:获取文件大小
// int main(){
//     //定义源文件(54 字节)
//     char old_file_path[] = "/Users/yangshaohong/Desktop/test.txt";
//     //打开文件
//     FILE *file = fopen(old_file_path,"r");
//     //在C语言中可以将指针指向最后一个字节
//     //通过一个函数,将文件指针移动到文件的最后一个位置
//     //参数一:源文件
//     //参数二:偏移量(倒数第几个)
//     //参数三:位置标记(SEEK_END:表示文件指针移动到最后一个位置)
//     //一旦调用fseek,指针立马移动到指定的位置
//     fseek(file,0,SEEK_END);

//     //获取文件的大小:ftell方法(当前文件指针指向位置)
//     long fileSize = ftell(file);
//     printf("文件大小: %ld\n",fileSize);

//     getchar();
//     return 0;
// }

//内容五:文件加密(加密算法可以自定义)-文本文件
//分析算法:异或运算(^)
//假设:a = 5  b = 6
//a二进制:101
//b二进制:110
//异或运算规则:相同为0,不同为1
//a^b:异或运算 011
// int main(){
//     //源文件
//     char source_file_path[] = "/Users/yangshaohong/Desktop/test.txt";
//     //加密文件
//     char encpytion_file_path[] = "/Users/yangshaohong/Desktop/test_en.txt";
//     //打开源文件
//     FILE *source_p = fopen(source_file_path,"r");
//     //打开加密文件
//     FILE *encpytion_p = fopen(encpytion_file_path,"w");
//     //通过循环一个个字符读取,然后给每一个字节进行加密算法处理
//     int ch;
//     //参数一:源文件
//     //返回值:当前读取的位置---EOF: End of file(文件读取结束)
//     while((ch = fgetc(source_p)) != EOF){
//         //给单个字符进行异或运算
//         fputc(ch^6,encpytion_p);
//     }
//     //关闭流
//     fclose(encpytion_p);
//     fclose(source_p);

//     getchar();
//     return 0;
// }

//内容五:文件解密(加密算法可以自定义)-文本文件
//分析:异或运算(^)
//假设:a = 5  b = 6
//a二进制:101
//b二进制:110
//异或运算规则:相同为0,不同为1
//a^b:异或运算 011 = 3 = c
//c^b:异或运算
//c二进制:011
//b二进制:110
//结果:   101 = a(还原了)
// int main(){
//     //加密文件
//     char encpytion_file_path[] = "/Users/yangshaohong/Desktop/test_en.txt";
//     //解密文件
//     char decpytion_file_path[] = "/Users/yangshaohong/Desktop/test_de.txt";
//     //打加密文件
//     FILE *encpytion_p = fopen(encpytion_file_path,"r");
//     //打开解密文件
//     FILE *decpytion_p = fopen(decpytion_file_path,"w");
//     //通过循环一个个字符读取,然后给每一个字节进行加密算法处理
//     int ch;
//     //参数一:源文件
//     //返回值:当前读取的位置---EOF: End of file(文件读取结束)
//     while((ch = fgetc(encpytion_p)) != EOF){
//         //给单个字符进行异或运算
//         fputc(ch^6,decpytion_p);
//     }
//     //关闭流
//     fclose(decpytion_p);
//     fclose(encpytion_p);

//     getchar();
//     return 0;
// }

// //内容六:文件加密-二进制文件(通过密码来加密)
// int main(){
//     //源文件
//     char source_file_path[] = "/Users/yangshaohong/Desktop/icon_image.gif";
//     //加密文件
//     char encpytion_file_path[] = "/Users/yangshaohong/Desktop/icon_image_en.gif";
//     //打开源文件
//     FILE *source_p = fopen(source_file_path,"rb");
//     //打开加密文件
//     FILE *encpytion_p = fopen(encpytion_file_path,"wb");
//     //密码(我们要根据密码进行加密)
//     char pwd[] = "Dream";
//     //通过循环一个个字符读取,然后给每一个字节进行加密算法处理
//     int ch;
//     int i = 0;
//     //数组长度
//     int pwdLen  = strlen(pwd);
//     //参数一:源文件
//     //返回值:当前读取的位置---EOF: End of file(文件读取结束)
//     while((ch = fgetc(source_p)) != EOF){
//         //给单个字符进行异或运算
//         fputc(ch^pwd[i%pwdLen],encpytion_p);
//         i++;
//     }
//     //关闭流
//     fclose(encpytion_p);
//     fclose(source_p);

//     getchar();
//     return 0;
// }

//内容六:文件解密-二进制文件(通过密码来解密)
// int main(){
//     //密码(我们要根据密码进行加密)
//     char pwd[5];
//     printf("请输入解密密码:");
//     scanf("%s",pwd);

//     //加密文件
//     char encpytion_file_path[] = "/Users/yangshaohong/Desktop/icon_image_en.gif";
//     //解密文件
//     char decpytion_file_path[] = "/Users/yangshaohong/Desktop/icon_image_de.gif";
//     //打加密文件
//     FILE *encpytion_p = fopen(encpytion_file_path,"rb");
//     //打开解密文件
//     FILE *decpytion_p = fopen(decpytion_file_path,"wb");
//     //通过循环一个个字符读取,然后给每一个字节进行加密算法处理
//     int ch;
//     int i = 0;
//     //数组长度
//     int pwdLen  = strlen(pwd);
//     //参数一:源文件
//     //返回值:当前读取的位置---EOF: End of file(文件读取结束)
//     while((ch = fgetc(encpytion_p)) != EOF){
//         //给单个字符进行异或运算
//         fputc(ch^pwd[i%pwdLen],decpytion_p);
//         i++;
//     }
//     //关闭流
//     fclose(decpytion_p);
//     fclose(encpytion_p);

//     getchar();
//     return 0;
// }

//内容七:文件分割

//获取文件大小
int getFileSize(char old_file_path[])
{
    FILE *file = fopen(old_file_path, "r");
    fseek(file, 0, SEEK_END);
    long fileSize = ftell(file);
    return fileSize;
}

// int main(){
//     //分为两步
//     //第一步:获取分割文件名称
//     //源文件
//     char source_file_path[] = "/Users/yangshaohong/Desktop/icon_image.gif";

//     int file_number = 6;

//     //开辟一块内存区域:用于存储文件的名称(二维指针)
//     //存放字符串(二维字符指针)
//     //首先:char *p = source_file_path;--首地址(字符串)
//     //char source_file_path[] = "/Users/yangshaohong/Desktop/icon_image_1.gif";
//     //char source_file_path[] = "/Users/yangshaohong/Desktop/icon_image_2.gif";
//     //char source_file_path[] = "/Users/yangshaohong/Desktop/icon_image_3.gif";
//     char **file_name_array = (char**)malloc(sizeof(char*)*file_number);
//     for(int i = 0 ; i < file_number ; i++){
//         //开辟内存空间,用于存放文件路径
//         file_name_array[i] = (char*)malloc(sizeof(char)*300);
//         //赋值(字符串的格式化:sprintf)
//         //结果:/Users/yangshaohong/Desktop/icon_image_0.gif
//         //结果:/Users/yangshaohong/Desktop/icon_image_1.gif
//         sprintf(file_name_array[i],"/Users/yangshaohong/Desktop/icon_image_%d.gif",i);
//         printf("文件名称:%s\n",file_name_array[i]);
//     }

//     //第二步:向指定的分割文件写入内容
//     //分析问题:每一个文件大小是多少?
//     //假设:源文件大小51  分割成6个文件   每一个文件的大小?
//     //两种情况:第一种情况能够平分(54%6=0)
//     //第二种情况不能够平分(50%6!=0)
//     //例如:源文件大小51  分割成6个文件  前5个10  最后1个1
//     //例如:源文件大小51  分割成7个文件  前6in�51/(7-1)=8  最后1个51%(7-1)=3
//     //例如:源文件大小51  分割成8个文件  前7个51/(8-1)=7  最后1个51%(8-1)=2
//     //例如:源文件大小51  分割成11个文件  前10个51/(11-1)=5  最后1个51%(11-1)=1
//     //以此类推: 源文件大小num  分割成n个  前n-1个大小=num/(n-1)  最后1个大小=num%(n-1)
//     long file_size_sum = getFileSize(source_file_path);
//     //打开源文件
//     FILE *source_p = fopen(source_file_path,"rb");
//     if(file_size_sum%file_number == 0){
//         //平均分
//         //计算每一个分割文件大小
//         long file_size = file_size_sum / file_number;
//         //遍历:写入内容
//         //外层循环控制分割文件,内存循环控制文件的写入
//         for(int i = 0;i<file_number;i++){
//             //打开分割文件
//             FILE *file_cut = fopen(file_name_array[i],"wb");
//             for(int j = 0 ;j<file_size;j++){
//                 //参数一:获取源文件内容
//                 //参数二:写入分割-目标文件
//                 fputc(fgetc(source_p),file_cut);
//             }
//             //关闭当前分割文件流
//             fclose(file_cut);
//         }
//         //关闭源文件流
//         fclose(source_p);
//     }else{
//         //不均等
//         //计算每一个分割文件大小
//         long file_size = file_size_sum / (file_number-1);

//         //处理前面的分割文件
//         //遍历:写入内容
//         //外层循环控制分割文件,内存循环控制文件的写入
//         for(int i = 0;i<file_number-1;i++){
//             //打开分割文件
//             FILE *file_cut = fopen(file_name_array[i],"wb");
//             for(int j = 0 ;j<file_size;j++){
//                 //参数一:获取源文件内容
//                 //参数二:写入分割-目标文件
//                 fputc(fgetc(source_p),file_cut);
//             }
//             //关闭当前分割文件流
//             fclose(file_cut);
//         }

//         //写入最后一个文件(单独处理)
//         //打开分割文件
//         //打开最后一个文件
//         FILE *file_last_cut = fopen(file_name_array[file_number - 1],"wb");
//         long last_file_size = file_size_sum % (file_number-1);
//         //你不这么做,后面会填写'\0'
//         for(int j = 0 ;j<last_file_size;j++){
//            //参数一:获取源文件内容
//            //参数二:写入分割-目标文件
//            fputc(fgetc(source_p),file_last_cut);
//         }
//         //关闭当前分割文件流
//         fclose(file_last_cut);

//         //关闭源文件流
//         fclose(source_p);
//     }

//     getchar();
//     return 0;
// }

//合并文件
int main()
{
    //分为两步
    //第一步:获取分割文件名称
    //源文件
    char source_file_path[] = "/Users/yangshaohong/Desktop/icon_image.gif";
    //合并之后的文件路径
    char merge_file_path[] = "/Users/yangshaohong/Desktop/icon_image_merge.gif";

    int file_number = 6;

    //开辟一块内存区域:用于存储文件的名称(二维指针)
    //存放字符串(二维字符指针)
    char **file_name_array = (char **)malloc(sizeof(char *) * file_number);
    for (int i = 0; i < file_number; i++)
    {
        //开辟内存空间,用于存放文件路径
        file_name_array[i] = (char *)malloc(sizeof(char) * 300);
        //赋值(字符串的格式化:sprintf)
        sprintf(file_name_array[i], "/Users/yangshaohong/Desktop/icon_image_%d.gif", i);
        printf("文件名称:%s\n", file_name_array[i]);
    }

    //合并文件
    
    //打开源文件
    FILE *merge_p = fopen(merge_file_path, "wb");
    for (int i = 0; i < file_number; i++)
    {
        //计算每一个分割文件的大小
        long file_size_sum = getFileSize(file_name_array[i]);
        //打开分割文件,重分割的文件中读取内容
        FILE *file_cut = fopen(file_name_array[i], "rb");
        for (int j = 0; j < file_size_sum; j++)
        {
            //参数一:分割文件(源文件)
            //参数二:写入合并的文件-目标文件
            //加密也是一样的,将fgetc(file_cut)按照我们之前的做法进行
            fputc(fgetc(file_cut), merge_p);
        }
        //关闭当前分割文件流
        fclose(file_cut);
    }
    //关闭源文件流
    fclose(merge_p);

    getchar();
    return 0;
}


整理自代码

C语言api在线文档:http://ganquan.info/standard-c/function/fopen



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值