文件的读
#include <stdio.h>
#include <stdlib.h> // 文件的操作,是在这个头文件里面的
#include <string.h>
int main() {
// fopen打开文件的意思(参数1:文件路径 文件源, 参数2:模式 r(读) w(写) rb(作为二进制文件读) rw(作为二进制文件写) 返回值 FILE 结构体)
// FILE * fopen (const char *, const char *);
char * fileNameStr = "D:\\Temp\\DerryFile.txt";
// 既然是使用了r,你要提前准备好文件
FILE * file = fopen(fileNameStr, "r");
if (!file) {
printf("文件打开失败,请你个货检测:路径为%s路径的文件,看看有什么问题\n", fileNameStr);
exit(0); // 退出程序
}
// 先定义缓存区域 (容器)
char buffer[10];
// 1.缓冲区buffer, 2:长度10, 3:文件指针变量
while (fgets(buffer, 10, file)) {
printf("%s", buffer);
}
// 关闭文件
fclose(file);
return 0;
}
文件的写
#include <stdio.h>
#include <stdlib.h> // 文件的操作,是在这个头文件里面的
#include <string.h>
int main() {
// fopen打开文件的意思(参数1:文件路径 文件源, 参数2:模式 r(读) w(写) rb(作为二进制文件读) rw(作为二进制文件写) 返回值 FILE 结构体)
// FILE * fopen (const char *, const char *);
char * fileNameStr = "D:\\Temp\\DerryFileW.txt";
// 既然是使用了w,他会自动生成文件 0kb
FILE * file = fopen(fileNameStr, "w");
if (!file) {
printf("文件打开失败,请你个货检测:路径为%s路径的文件,看看有什么问题\n", fileNameStr);
exit(0); // 退出程序
}
fputs("Derry Success run...", file);
// 关闭文件
fclose(file);
return 0;
}
文件的复制
#include <stdio.h>
#include <stdlib.h> // 文件的操作,是在这个头文件里面的
#include <string.h>
// 二进制文件来复制 rb wb
int main() {
// https://en.cppreference.com/w/c/io
char * fileNameStr = "D:\\Temp\\DerryFile.txt"; // 来源
char * fileNameStrCopy = "D:\\Temp\\DerryFileCopy.txt"; // 目标
// rb 读取二进制数据
FILE * file = fopen(fileNameStr, "rb");
// wb 写入二进制数据
FILE * fileCopy = fopen(fileNameStrCopy, "wb");
if (!file || !fileCopy) {
printf("文件打开失败,请你个货检测:路径为%s路径的文件,看看有什么问题\n", fileNameStr);
exit(0); // 退出程序
}
int buffer[514]; // 514 * 4 = 2048
int len; // 每次读取的长度
// fread:参数1:容器buffer, 参数2:每次偏移多少 int, 参数3:容器大小 写个2048,等下文件就报废了
// sizeof(buffer) / sizeof(int) 等价与 514
while ((len = fread(buffer, sizeof(int), 514 , file)) != 0) {
fwrite(buffer, sizeof(int), len, fileCopy);
}
// 关闭文件
fclose(file);
fclose(fileCopy);
return 0;
}
文件大小的获取
#include <stdio.h>
#include <stdlib.h> // 文件的操作,是在这个头文件里面的
#include <string.h>
int main() {
// 没有专门的 文件大小获取 API,
// (思路:)读取头指针 头指针挪动位置,挪动到最后,就可以求得文件大小
char * fileNameStr = "D:\\Temp\\DerryFile.txt"; // 来源
// 既然是使用了w,他会自动生成文件 0kb
FILE * file = fopen(fileNameStr, "rb"); // file == 指针
if (!file) {
printf("文件打开失败,请你个货检测:路径为%s路径的文件,看看有什么问题\n", fileNameStr);
exit(0); // 退出程序
}
// 都是操作指针来玩的
// SEEK_SET(开头) SEEK_CUR(当前) SEEK_END(结尾)
fseek(file, 0, SEEK_END);
// 走到这里之后:file有了更丰富的值,给你的file指针赋值,挪动的记录信息
// 读取 刚刚给file赋值的记录信息
// 其实此函数目的是:计算偏移的位置,ftell 从 0 开始统计到当前(SEEK_END)
long file_size = ftell(file);
printf("%s文件的字节大小是:%ld\n", fileNameStr, file_size);
// 8 字节 (8 字节)
// 关闭文件
fclose(file);
return 0;
}
文件加密
#include <stdio.h>
#include <stdlib.h> // 文件的操作,是在这个头文件里面的
#include <string.h>
int main() {
char * fileNameStr = "D:\\Temp\\IMG.jpg"; // 来源
char * fileNameStrEncode = "D:\\Temp\\IMG_encode.jpg"; // 加密后的目标文件
FILE * file = fopen(fileNameStr, "rb"); // r 必须字节提前准备好文件
FILE * fileEncode = fopen(fileNameStrEncode, "wb"); // w 创建一个0kb的文件
if (!file || !fileEncode) {
printf("文件打开失败,请你个货检测:路径为%s路径的文件,看看有什么问题\n", fileNameStr);
exit(0); // 退出程序
}
// 【加密 和 解密 的 思路】
// 加密 == 破坏文件
// 解密 == 还原文件 还原之前的样子
// ---
// 加密的想法:(全部)把每一个字节都拿出来,对每一个字节都全部处理, (部分加密:把某一部分内容拿出来处理)
// TODO 加密的想法
// while 循环遍历的时候 取出来的 10
// 10 ^异或 5 就变成这个效果1111
/// TODO 解密的想法
// while 循环遍历的时候 取出来的 1111
// 1111 ^异或 5 就变成这个效果10(还原)
int c; // 接收读取的值
// fgetc(文件指针) 返回值 EOF = end fo file
while ((c = fgetc(file)) != EOF) {
// 加密操作
fputc(c ^ 5, fileEncode ); // 写入到 fileEncode D:\Temp\IMG_encode.jpg(加密后的图片)
}
// 关闭文件
fclose(file);
fclose(fileEncode);
return 0;
}
文件的解密
#include <stdio.h>
#include <stdlib.h> // 文件的操作,是在这个头文件里面的
#include <string.h>
int main() {
char *fileNameStr = "D:\\Temp\\IMG_encode.jpg"; // 来源
char *fileNameStrDecode = "D:\\Temp\\IMG_decode.jpg"; // 解密后的目标文件
FILE * file = fopen(fileNameStr, "rb"); // r 必须字节提前准备好文件
FILE * fileEncode = fopen(fileNameStrDecode, "wb"); // w 创建一个0kb的文件
if (!file || !fileEncode) {
printf("文件打开失败,请你个货检测:路径为%s路径的文件,看看有什么问题\n", fileNameStr);
exit(0); // 退出程序
}
int c;
while ((c = fgetc(file)) != EOF) {
// 解密操作 1111 ^ 5 = 10;(还原)
fputc(c ^ 5, fileEncode);
}
fclose(file);
fclose(fileEncode);
return 0;
}
文件的加密,使用密钥
#include <stdio.h>
#include <stdlib.h> // 文件的操作,是在这个头文件里面的
#include <string.h>
int main() {
char *fileNameStr = "D:\\Temp\\IMG.jpg"; // 来源
char * fileNameStrEncode = "D:\\Temp\\IMG_encode.jpg"; // 加密后的目标文件
// 密钥
char * password = "123456"; // 我现在做的事情:我的密钥 必须生效
FILE * file = fopen(fileNameStr, "rb"); // r 必须字节提前准备好文件
FILE * fileEncode = fopen(fileNameStrEncode, "wb"); // w 创建一个0kb的文件
if (!file || !fileEncode) {
printf("文件打开失败,请你个货检测:路径为%s路径的文件,看看有什么问题\n", fileNameStr);
exit(0); // 退出程序
}
int c;
int index = 0;
int pass_len = strlen(password);
while ((c = fgetc(file)) != EOF) {
char item = password[index%pass_len];
// 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 ...
printf("item:%c%\n", item);
fputc(c ^ item, fileEncode);
index ++;
}
// 关闭文件
fclose(file);
fclose(fileEncode);
}
文件的解密,使用密钥
#include <stdio.h>
#include <stdlib.h> // 文件的操作,是在这个头文件里面的
#include <string.h>
int main() {
char * fileNameStr = "D:\\Temp\\IMG_encode.jpg"; // 来源
char * fileNameStrDecode = "D:\\Temp\\IMG_decode.jpg"; // 解密后的目标文件
FILE * file = fopen(fileNameStr, "rb"); // r 必须字节提前准备好文件
FILE * fileDecode = fopen(fileNameStrDecode, "wb"); // w 创建一个0kb的文件
if (!file || !fileDecode) {
printf("文件打开失败,请你个货检测:路径为%s路径的文件,看看有什么问题\n", fileNameStr);
exit(0); // 退出程序
}
// 密钥
char * password = "123456"; // 我现在做的事情:我的密钥 必须生效
int c;
int index = 0;
int pass_len = strlen(password);
while ((c = fgetc(file)) != EOF) {
fputc(c ^ password[index%pass_len], fileDecode);
index++;
}
fclose(file);
fclose(fileDecode);
return 0;
}