前言
本篇学习文件的读写和文件的加解密。
PS:本系列内容为程序媛学习C语言时做的笔记。以代码为主,并备注了打印结果以及详尽的解释注释。希望对你有所帮助。
C语言笔记入门篇包含多篇内容,当前位置:第七篇,也是本系列最后一篇。
C语言并不可怕,请沉下心来,耐心就有收获。
几个函数
函数名: fopen
功 能: 打开一个流
用 法: FILE *fopen(char *filename, char *type);
参数:
1:文件路径 文件源
2:模式 r(读) w(写) rb(作为二进制文件读) wb(作为二进制文件写)
返回值:
FILE 结构体
函数名: fgets
功 能: 从流中读取一字符串
用 法: char *fgets(char *string, int n, FILE *stream);
参数:
1.缓冲区buffer
2.长度
3.文件指针变量
函数名: fgetc
功 能: 从流中读取字符。
每次从文件中读取一个字符,并且返回所读取的这个字符。如果读到文件末尾,则函数返回“EOF”。
用 法: int fgetc(FILE *stream);
函数名: fread
功 能: 从一个流中读数据
用 法: int fread(void *ptr, int size, int nitems, FILE *stream);
文件的读
#include <stdio.h>
#include <stdlib.h>//文件的操作,是在这个头文件里面的
void readFile() {
char *loc = "E:\\学习资料\\sun.txt";
//既然是使用了r,你要提前准备好文件
FILE *file = fopen(loc, "r");
if (!file) {
printf("文件打开失败");
exit(0);//退出程序
}
//先定义缓存区域 (容器)
char buffer[10];
//1.缓冲区buffer, 2:长度10, 3:文件指针变量
while (fgets(buffer,10,file)){
printf("%s",buffer);
}
//关闭文件
fclose(file);
}
文件的写
void writeFile() {
char *loc = "E:\\学习资料\\sunW.txt";
//既然是使用了w,他会自动生成 0kb 的文件
FILE *file = fopen(loc, "w");
if (!file) {
printf("文件打开失败\n");
exit(0);
}
fputs("writeFile测试", file);
fclose(file);
}
文件的复制
void copyFile() {
// 二进制文件来复制
char *fromLoc = "E:\\学习资料\\sun.txt";
char *toLoc = "E:\\学习资料\\sunCopy.txt";
//rb 读取二进制数据
FILE *fromFile = fopen(fromLoc, "rb");
// wb 写入二进制数据
FILE *toFile = fopen(toLoc, "wb");
if (!fromFile || !toFile) {
printf("文件打开失败\n");
exit(0);
}
int buffer[200];
int len;//每次读取的长度
//fread参数:容器buffer / 每次偏移多少 / 容器buffer的大小
//200也可用:sizeof(buffer) / sizeof(int)
while ((len = fread(buffer, sizeof(int), 200, fromFile)) != 0) {
fwrite(buffer, sizeof(int), len, toFile);
}
fclose(fromFile);
fclose(toFile);
}
文件大小的获取
void getFileSize() {
// 没有专门的 文件大小获取 API,
// (思路:)读取头指针 头指针挪动位置,挪动到最后,就可以求得文件大小
char *loc = "E:\\学习资料\\sun.txt";
FILE *file = fopen(loc, "rb");
if (!file) {
printf("文件打开失败\n");
exit(0);
}
//参数 :要操作的文件指针/从零开始/到结尾
// fseek:每挪动一下,记录一下信息到file里面
// SEEK_SET(开头) SEEK_CUR(当前) SEEK_END(结尾)
fseek(file, 0, SEEK_END);
// 走到这里之后:file有了更丰富的值,给你的file指针赋值,挪动的记录信息
// 读取 刚刚给file赋值的记录信息
// 其实此函数目的是:计算偏移的位置,ftell 从 0 开始统计到当前(SEEK_END)
long fileSize = ftell(file);
printf("文件大小:%ld\n", fileSize);
fclose(file);
}
文件加解密
【加密 和 解密 的 思路】
加密 == 破坏文件
解密 == 还原文件 还原之前的样子
加密的想法:(全部)把每一个字节都拿出来,对每一个字节都全部处理, (部分加密:把某一部分内容拿出来处理)
加密的想法
while 循环遍历的时候 取出来的 10
10 ^异惑 5 就变成这个效果1111
解密的想法
while 循环遍历的时候 取出来的 1111
1111 ^异惑 5 就变成这个效果10(还原)
void encodeFile() {
// 二进制文件来复制
char *fromLoc = "E:\\学习资料\\sun.txt";
char *toLoc = "E:\\学习资料\\sunEncode.txt";
//char *fromLoc = "E:\\学习资料\\sunEncode.txt";
// char *toLoc = "E:\\学习资料\\sunDecode.txt";
FILE *fromFile = fopen(fromLoc, "rb");
FILE *toFile = fopen(toLoc, "wb");
if (!fromFile || !toFile) {
printf("文件打开失败\n");
exit(0);
}
char c;//接收读取的值
while ((c = fgetc(fromFile)) != EOF) {//没到文件结尾
// 加密操作 也可加密图片
fputc(c ^ 5, toFile);
}
fclose(fromFile);
fclose(toFile);
}
利用抑或(^)来加解密的代码是一样的,更改个文件使用路径就行。
使用密钥加解密
void encodeFile2() {
char *fromLoc = "E:\\学习资料\\sun.txt";
char *toLoc = "E:\\学习资料\\sunEncode.txt";
//char *fromLoc = "E:\\学习资料\\sunEncode.txt";
//char *toLoc = "E:\\学习资料\\sunDecode.txt";
char *password = "123456";//密钥
FILE *fromFile = fopen(fromLoc, "rb");
FILE *toFile = fopen(toLoc, "wb");
if (!fromFile || !toFile) {
printf("文件打开失败\n");
exit(0);
}
char c;
int index = 0;
int pass_len = strlen(password);
while ((c = fgetc(fromFile)) != EOF) {
char item = password[index % pass_len];
printf("测试:%c\n", item);//12345612345612...
fputc(c ^ item, toFile);
index++;
}
fclose(fromFile);
fclose(toFile);
}
解密代码同加密,更改要解密文件的地址和目标生成地址即可。
结语
恭喜你,本系列学习完成~ 损耗:0根头发! hhhhhhhhh… *(●’◡’●)*
如有文章有错误,望指正。祝愿正在看文章的你身体健康!!(๑•̀ㅂ•́)و✧