C语言学习笔记 入门篇-7(完结)

前言

本篇学习文件的读写文件的加解密

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… *(●’◡’●)*

如有文章有错误,望指正。祝愿正在看文章的你身体健康!!(๑•̀ㅂ•́)و✧

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值