从Android/Java基础之上学习C/C++语言(7)--C语言基础--IO

前言

NDK开发需要用到C/C++语言,为什么需要这两个语言?因为通过NDK开发能够解决Java做不到或者Java做的话效率、安全性会很低的问题。比如说视频处理(直播)、GIF的处理(需要对内存进行大量地分配和释放)、支付SDK(安全性)等。

学习NDK能够大大开阔我们的视野,NDK是一些大公司都要求掌握的技术,因此很有学习的必要。

本系列介绍的是NDK开发里面会用到的C/C++语言知识,其他的知识暂时不作介绍。这里并不会从零开始介绍,而是在学习了Java的基础之上来学习,这样能够大大提高我们的效率,又能反过来更加深刻地理解Java的机制。要求读者最好有一定(最基本的)Java语言(编程语言)基础

读写文本文件

主要用到了fgets和fputs两个函数(函数名中的s是指String,字符串的意思):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main(){

    //文件路径
    char* path = "D:\\test.txt";
    char* path_new = "D:\\test_new.txt";

    //打开文件,返回文件的指针
    FILE* f_read = fopen(path, "r");
    FILE* f_write = fopen(path_new, "w");

    //文件是否成功打开
    if (f_read == NULL || f_write == NULL){
        printf("文件打开失败");
        return;
    }

    //读取文件
    char buff[50];//缓冲区
    while (fgets(buff, 50, f_read)){
        //写文件
        fputs(buff, f_write);
    }

    //关闭文件
    fclose(f_read);
    fclose(f_write);

    system("pause");
}

_CRT_SECURE_NO_WARNINGS用于Visual Studio2013编译去掉警告。

读写二进制文件

计算机的文件存储在物理上都是二进制,文本文件和二进制之分,其实是一个人为的逻辑之分。

C读写文本文件与二进制文件的差别仅仅体现在回车换行符:

  1. 写文本时,每遇到一个’\n’,会将其转换成’\r\n’(回车换行)。
  2. 读文本时,每遇到一个’\r\n’,会将其转换成’\n’。
  3. 但是读写二进制文件的时候并不会做以上转换。

下面是二进制文件读写的例子(图片的复制):

主要用到了fread和fwrite两个函数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//Ctrl k d

void main(){

    //文件路径
    char* path = "D:\\test.png";
    char* path_new = "D:\\test_new.png";

    //打开文件,返回文件的指针,b代表是二进制文件
    FILE* f_read = fopen(path, "rb");
    FILE* f_write = fopen(path_new, "wb");

    //文件是否成功打开
    if (f_read == NULL || f_write == NULL){
        printf("文件打开失败");
        return;
    }

    //读取文件
    int buff[50];//缓冲区,注意,读写二进制文件的时候,是用int类型的缓冲区
    int len = 0; //每次读取到的长度
    //读到的内容放到缓冲区,缓冲区的单位大小,缓冲区大小(一个性读50个int的大小(4字节)的数据)
    //也就是一次读50 X 4 200字节的数据
    //返回的len是读取到的长度,小于等于50
    while ((len = fread(buff, sizeof(int), 50, f_read)) != 0){
        //写文件
        fwrite(buff, sizeof(int), len, f_write);
    }

    //关闭文件
    fclose(f_read);
    fclose(f_write);

    system("pause");
}
注意
  1. 缓冲区用int类型的数组。
  2. 文件读写模式后面加上b代表读写二进制文件。

获取文件大小

主要用到了fseek和ftell函数:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main(){

    //文件路径
    char* path = "D:\\test.png";

    //打开文件,返回文件的指针,b代表是二进制文件
    FILE* f_read = fopen(path, "rb");

    //文件是否成功打开
    if (f_read == NULL){
        printf("文件打开失败");
        return;
    }

    //类似于多线程下载的概念,首先将文件长度按N段分,然后将每段文件读取并写入到相应的临时文件
    fseek(f_read, 0L, SEEK_END);//seek到文件的结尾,0L代表向前偏移几个字节
    long len = ftell(f_read);//返回当前的文件指针相对于文件开头的位移量
    printf("%ld", len);

    //关闭文件
    fclose(f_read);

    system("pause");
}

文件加密、解密

用简单的异或运算进行加密,解密的话就是一个逆过程。

规则:1^1=0, 0^0=0, 1^0=1, 0^1=1 同为0,不同为1

void crpypt(char* filePath, char* crpyptFilePath){

    //打开文件,返回文件的指针
    FILE* f_read = fopen(filePath, "r");
    FILE* f_write = fopen(crpyptFilePath, "w");

    //文件是否成功打开
    if (f_read == NULL || f_write == NULL){
        printf("文件打开失败");
        return;
    }

    int ch;//一次读取一个字符,每一个字符都是一个数据,用int来表示
    //EOF End Of File = -1
    while ((ch = fgetc(f_read)) != EOF){
        fputc(ch ^ 9, f_write);//用异或运算进行加密
    }

    //关闭文件
    fclose(f_read);
    fclose(f_write);
}

void main(){

    //文件路径
    char* path = "D:\\test.txt";
    char* path_new = "D:\\test_new.txt";

    //文件加密crpypt
    crpypt(path, path_new);

    //文件解密decrpypt,是一个逆过程,注意先把原来的文件删除
    crpypt(path_new, path);

    system("pause");
}

二进制文件加解密

//二进制文件加解密
//读取二进制文件中的数据时,一个一个字符读取
//密码:password
void crpypt(char normal_path[], char crypt_path[],char password[]){
    //打开文件
    FILE *normal_fp = fopen(normal_path, "rb");
    FILE *crypt_fp = fopen(crypt_path, "wb");
    //一次读取一个字符
    int ch;
    int i = 0; //循环使用密码中的字母进行异或运算
    int pwd_len = strlen(password); //密码的长度
    while ((ch = fgetc(normal_fp)) != EOF){ //End of File
        //写入(异或运算)
        fputc(ch ^ password[i % pwd_len], crypt_fp);
        i++;
    }
    //关闭
    fclose(crypt_fp);
    fclose(normal_fp);
}

通过下面的代码进行加密。

ch ^ password[i % pwd_len]

其中:

int pwd_len = strlen(password); //密码的长度

二进制文件记得加上小b,加密以后文件不能正常打开了,因为文件损坏了。

微信的数据库是加密的,用C语言(动态库so反编译很难)加密。不会用Java去做,因为安全性不够,Java的反编译比较容易。

想往上发展,NDK、Linux还是必须的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值