引入IO库:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
读取文件-文本文件
//文件的路径
char file_path[] = "/Desktop/test.txt";
//打开文件(和Java类似)
//参数一:文件路径
//参数二:文件权限(例如:r代表读 w代表写 rw读写)
//返回值:文件指针
FILE *file = fopen(file_path,"r");
//判断一下文件是否为空(Java里面 obj == null)
if(file == NULL){
printf("当前文件不存在.....");
return 0;
}
//存在-读取内容
//定义缓冲区
char buffer[100];
//参数一:缓冲区
//参数二:每次读取长度(注意:不能够超过缓冲区的大小)
//参数三:源文件
//返回值:字符指针(如果返回'\0',否则存在)
while(fgets(buffer,100,file)){
//打印
//注意:不需要加换行符
printf("%s",buffer);
}
fclose(file)
写入文件-文本文件
//写文件的路径
char file_path[] = "/Desktop/test_new.txt";
//首先需要打开文件
FILE *file = fopen(file_path,"w");
//字符串(字符数组)
char content[] = "I have a C.";
//参数一:写入的内容
//参数二:源文件
fputs(content,file);
//关闭流
fclose(file);
二进制文件读写
计算机中分为了二进制文件和文本文件(逻辑上面区分,对于计算机本身而言都是二进制)
二进制文件和文本文件区别?
答:就在于换行符不一样
文本文件:
写入文件:每当遇到’\n’,会将其转成’\r\n’(回车换行)
读取文本:每当遇到’\r\n’,就会将其转成’\n’
二进制文件:复制
//将文件的内容写到另外一个文件中(边读边写)
//定义源文件
char old_file_path[] = "/Desktop/test.txt";
//定义目标文件
char new_file_path[] = "/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();
获取文件大小
//定义源文件(54 字节)
char old_file_path[] = "/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);
文件加密(加密算法可以自定义)-文本文件
分析算法:异或运算(^)
假设:a = 5 b = 6
a二进制:101
b二进制:110
异或运算规则:相同为0,不同为1
a^b:异或运算 011
//源文件
char source_file_path[] = "/Desktop/test.txt";
//加密文件
char encpytion_file_path[] = "/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);
文件解密(加密算法可以自定义)-文本文件
分析:异或运算(^)
假设:a = 5 b = 6
异或运算规则:相同为0,不同为1
a^b:异或运算 011 = 3 = c
c^b:异或运算
c二进制:011
b二进制:110
结果: 101 = a(还原了)
//加解密文件路径
char encpytion_file_path[] = "/Desktop/test_en.txt";
char decpytion_file_path[] = "/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);
文件加密-二进制文件(通过密码来加密)
//源文件
char source_file_path[] = "/Desktop/icon_image.gif";
//加密文件
char encpytion_file_path[] = "/Desktop/icon_image_en.gif";
//打开源文件
FILE *source_p = fopen(source_file_path,"rb");
//打开加密文件
FILE *encpytion_p = fopen(encpytion_file_path,"wb");
//密码(我们要根据密码进行加密)
char pwd[] = "Zero";
//通过循环一个个字符读取,然后给每一个字节进行加密算法处理
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);
文件解密-二进制文件(通过密码来解密)
//密码(我们要根据密码进行加密)
char pwd[5];
printf("请输入解密密码:");
scanf("%s",pwd);
//加密文件
char encpytion_file_path[] = "/Desktop/icon_image_en.gif";
//解密文件
char decpytion_file_path[] = "/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);
文件分割
//获取文件大小
int getFileSize(char old_file_path[]){
FILE *file = fopen(old_file_path, "r");
fseek(file, 0, SEEK_END);
long fileSize = ftell(file);
return fileSize;
}
//分为两步
//第一步:获取分割文件名称
//源文件
char source_file_path[] = "/Desktop/icon_image.gif";
int file_number = 6;
//开辟一块内存区域:用于存储文件的名称(二维指针)
//存放字符串(二维字符指针)
//首先:char *p = source_file_path;--首地址(字符串)
//char source_file_path[] = "/Desktop/icon_image_1.gif";
//char source_file_path[] = "/Desktop/icon_image_2.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)
//结果:/Desktop/icon_image_0.gif
//结果:/Desktop/icon_image_1.gif
sprintf(file_name_array[i],"/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个文件 前6个 51/(7-1)=8 最后1个51%(7-1)=3
//例如:源文件大小51 分割成8个文件 前7个51/(8-1)=7 最后1个51%(8-1)=2
//以此类推: 源文件大小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);
}
合并文件
//分为两步
//第一步:获取分割文件名称
//源文件
char source_file_path[] = "/Desktop/icon_image.gif";
//合并之后的文件路径
char merge_file_path[] = "/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], "/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);