深入理解C实现文本文件的加密解密,读取长度操作

 首先从获取文本文件长度下手:

 获取文本文件长度比较这两种办法的差异:

extern int getFileSizeError() {
    FILE *fsource = fopen(strFile, "r");
    if (fsource == NULL) {
        return -1;
    }
    char tmp;
    int length = 0;
    while ((tmp = fgetc(fsource)) != EOF) {
        length++;
    }
    fclose(fsource);
    return length;
}


extern int getFileSize() {
    FILE *fsource = fopen(strFile, "rb");
    if (fsource == NULL) {
        return -1;
    }
    char tmp;
    int length = 0;
    while ((tmp = fgetc(fsource)) != EOF) {
        length++;
    }
    fclose(fsource);
    return length;
}


得到的文件大小不一样,现在看一个例子看一下问题的根本是什么

extern void writeFile() {
    FILE *file = fopen(shaoTestOut, "w");
    int i = 0;
    for (; i < 5; i++) {
        fputc('\n', file);
    }
    fclose(file);
}
这个时候文件大小实际是10Byte大小, getFileSizeError()结果只有5Byte而getFileSize()结果有10Byte,原因是'\n'写入文件的时候系统会自动写入"\r\n",读取文件的时候会将"\r\n"识别为'\n'

所以读取文件大小的时候应当用二进制读取方式,这样"\r\n"就会以'\r','\n'两个字节方式读取

或者可以用这个方法

extern int getFileSize2() {
    FILE *fsource = fopen(shaoTestOut, "r");
    if (fsource == NULL) {
        return -1;
    }
    char tmp;
    int length;
    while ((tmp = fgetc(fsource)) != EOF) {
        if (tmp == '\n') {
            length += 2;
        } else {
            length += 1;
        }
    }
    fclose(fsource);
    return length;
}


通过上面获取文件长度的函数明白了二进制文件与文本文件的区别就是"\r\n"的处理,下面来看一段文件读取的操作

一般文本文件保存的是1-127的Asca值,默认是unsigned char类型的,如果操作的时候写入的是char类型的如写入--1

extern void wrietTest() {
    FILE *fsource = fopen(shaoTestOut, "w");
    char ch = -1;
    fputc(ch, fsource);
    fclose(fsource);
}

extern void readTest() {
    FILE *fsource = fopen(shaoTestOut, "r");
    char ch = fgetc(fsource);
    if (ch == EOF) {
        printf("yes eof %d\n", ch);
    } else {
        printf("no eof %d\n", ch);
    }
}


读取文件的时候如果用char ch = fgetc(fsoutrce) 就会出现ch == EOF或者溢出的情况就是-1



如果采用

extern void readTest() {
    FILE *fsource = fopen(shaoTestOut, "r");
    int ch = fgetc(fsource);
    if (ch == EOF) {
        printf("yes eof %d\n", ch);
    } else {
        printf("no eof %d\n", ch);
    }
}
结果就是

所以为防止fgetc溢出的情况我们会采用int ch = fgetc()来进行读写


现在来试一下文件加密解密的过程

extern void jiajieWithPwd(char *source, char *out, char *pwd) {
    int fileSize = getFileSize();
    int length = strlen(pwd);
    FILE *fsource = fopen(source, "rb");
    FILE *fout = fopen(out, "wb");
    if (fsource == NULL || fout == NULL) {
        return;
    }
    int i = 0;
    int j = 0;
    for (; i < fileSize / length; i++) {
        for (j = 0; j < length; j++) {
            int ch = fgetc(fsource);
            ch = ch ^ pwd[j];
            fputc(ch, fout);
        }
    }
    j = 0;
    for (; j < fileSize % length; j++) {
        int ch = fgetc(fsource);
        ch = ch ^ pwd[j];
        fputc(ch, fout);
    }
    fclose(fsource);
    fclose(fout);
}


这样就可以实现完美的加密解密操作




  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值