ndk05_文件操作,文件加解密,预处理

一、文件操作

在linux中对所有的外部设备都当成了文件,包括键盘-浏览器-显示器等。

文件分为两部分:控制信息(图片的头等信息),内容信息(实际内容)

文本文件-图片和 二进制文件的区别:本质上都是二进制文件,只是文本文件是一种特殊的二进制文件没有其他信息
读文件:磁盘->文件缓冲区->应用程序内存空间

C语言中二进制文件和文本文件读写的区别:
    写文本的时候: '\n'  被替换成  \r\n 
    读文本的时候: \r\n  读成 '\n'
  • 1.读取文本文件
    #include "stdafx.h"
    #include <stdlib.h>
    
    int main(){
        //文件路径(C语言中单斜杠要改成双斜杠)
        char * path = "F:\\read.txt";
        //打开文件的api  返回一个文件所在的地址fp
        FILE *fp = fopen(path,"r"); //r :读
    
        //开辟一个50的char数据 存取都出来的内容
        char buff[50];

        //fgets(): 每次从指针里面获取50大小的数据放到buff里面
        while (fgets(buff,50,fp)){ 
            printf("%s ", buff); 
        }

        //一但写了读取文件 就点记得fclose
        fclose(fp);
    
        system("pause");
        return 0;
    }
  • 2.写文本文件

      #include "stdafx.h"
      #include <stdlib.h>
      
      int main(){
          
          //文件路径(C语言中单斜杠要改成双斜杠)
          char * path = "F:\\write.txt";
          //打开文件的api  返回一个文件所在的地址fp
          FILE *fp = fopen(path,"w"); //w :写  如果文件不存在会自动创建
      
          if (fp==NULL){
              printf("failed...");
              return 0;
          }
      
          char * text = "胡斌20170904.。。"; //需要写入的字符
      
          fputs(text, fp);
          fclose(fp); //关闭写入
    
          system("pause");
          return 0;
      }
    
  • 3.读写二进制文件(文件复制),预计要比java的读写快10倍左右。

    #include "stdafx.h"
    #include <stdlib.h>

    int main(){
        
        char * read_path = "F:\\txupd.exe"; //读路径
        char * write_path = "F:\\write.exe";//写路径
    
        FILE *read_fp = fopen(read_path,"rb"); //rb:以二进制形式读取   r:读的是纯文本
        FILE *write_fp = fopen(write_path, "wb");//wb:以二进制形式写
    
        char buff[50];
        int len = 0;
        //每次读取50个sizeof(char)大小的数据
        while ((len=fread(buff,sizeof(char),50,read_fp))!=0){
            //fwrite():每次从buff里面取长度为len以char为单位的数据写到write_fp里面
            fwrite(buff, sizeof(char), len, write_fp);
        }
    
        fclose(read_fp);
        fclose(write_fp);
    
        system("pause");
        return 0;
    }
  • 4.获取文件大小
    #include "stdafx.h"
    #include <stdlib.h>
    
    int main(){
        
        char * read_path = "F:\\txupd.exe"; //路径
        FILE *fp = fopen(read_path,"r"); 
    
        if (fp==NULL){
            return 0;
        }
    
        //fp指针要指向文件的末尾 偏移量为0
        //对fp做位移,fseek(fp,偏移量,指针开始的位置)
        //SEEK_SET 指向设置的位置
        //SEEK_END 文件末尾
        fseek(fp, 0, SEEK_END); //设定指针位置
        long filesize = ftell(fp); //取得文件大小
    
        printf("%ld\n", filesize);
    
        fclose(fp);
        system("pause");
        return 0;
    }

二、文件加解密

  • 1.文本文件加解密
    //加密
    void encode(char normal_path[], char encode_path[]){
        FILE * normal_fp = fopen(normal_path, "r");
        FILE * encode_fp = fopen(encode_path, "w");
    
        //打开文件复制到encode_fp中
        int ch;
        while ((ch=fgetc(normal_fp))!=EOF){ //EOF == -1:文件结束的标记
            fputc(ch^7, encode_fp);  //简单的加密算法: ^(异或) 7  
        }
    
        fclose(normal_fp);
        fclose(encode_fp);
    }
    
    //解密
    void decode(char encode_path[], char decode_path[]){
        FILE * encode_fp = fopen(encode_path, "r");
        FILE * decode_fp = fopen(decode_path, "w");
    
        //打开文件复制到encode_fp中
        int ch;
        while ((ch = fgetc(encode_fp)) != EOF){ //EOF == -1:文件结束的标记
            fputc(ch ^ 7, decode_fp);  //简单的加密算法: ^(异或) 7  
        }
    
        fclose(encode_fp);
        fclose(decode_fp);
    }
    
    
    
    int main(){
        
        //加密
        char* nomal_path = "F:\\text.txt";
        char * encode_path = "F:\\text_encode.txt";
        encode(nomal_path,encode_path);
    
        /*
        //解密
        char * encode_path = "F:\\text_encode.txt";
        char * decode_path = "F:\\text_decode.txt";
        decode(encode_path,decode_path);
    */
        return 0;
    }
  • 2.二进制文件加解密

      #include "stdafx.h"
      #include <stdlib.h>
      #include <string.h>
      
      /*
      *加密
      *normal_path: 原始文件路径
      *encode_path: 加密文件路径
      *password: 加密密码
      */
      void encode(char normal_path[], char encode_path[],char * password){
          FILE * normal_fp = fopen(normal_path, "rb");
          FILE * encode_fp = fopen(encode_path, "wb");
      
          //打开文件复制到encode_fp中
          int ch;
          int i = 0;
          int pwd_length = strlen(password);
          while ((ch=fgetc(normal_fp))!=EOF){ //EOF == -1:文件结束的标记
              fputc(ch^password[i%pwd_length], encode_fp);  //简单的加密算法: ch^ (i%密码长度)
              i = (i++) % 10001; //为了防止i溢出 % 10001
          }
          fclose(normal_fp);
          fclose(encode_fp);
      }
      
      /**
      *解密
      *encode_path :加密文件路径
      *decode_path :解密文件路径
      *password : 解密密码
      */
      void decode(char encode_path[], char decode_path[],char* password){
          FILE * encode_fp = fopen(encode_path, "rb");
          FILE * decode_fp = fopen(decode_path, "wb");
      
          //打开文件复制到encode_fp中
          int ch;
          int i = 0;
          int pwd_length = strlen(password);
          while ((ch = fgetc(encode_fp)) != EOF){ //EOF == -1:文件结束的标记
              fputc(ch^password[i%pwd_length], decode_fp);  //简单的加密算法: ^(异或) 7  
              i = (i++) % 10001;
          }
      
          fclose(encode_fp);
          fclose(decode_fp);
      }
      
      int main(){
          
          char* nomal_path = "F:\\text.png";
          char * encode_path = "F:\\text_encode.png";
          char * decpde_path = "F:\\text_decode.png";
          //加密
          encode(nomal_path,encode_path,"hubin");
          //解密
          //decode(encode_path, decpde_path, "hubin");
      
          return 0;
      }
    

三、预处理

还没有编译程序的时候会先进行预处理,以下是预处理的几种情况

  • 1.头文件引入
    1>创建A.txt 文件

       printf("hello hubin\n");
    

2>代码中引入文件,执行文件中定义好的代码

    #include "stdafx.h"
    #include <stdlib.h>
    
    int main(){
    //直接引入A.txt 文件里面的代码
    //预处理阶段完成代码的替换
    #include "A.txt"  
        system("pause");
    }
  • 2.宏定义1

      #include "stdafx.h"
      #include <stdlib.h>
      #include <string.h>
      
      //define宏定义:
      //将5;用NUM 替换,完全等价的替换 甚至后面如果加一个;都会替换掉,这是一种文本替换预处理阶段不会对这个定义进行任何的检查
      #define NUM 5;   
      
      int main(){
          for (int i = 0; i < NUM i++){ //代码中都不用再写分号
              printf("%d\n", i);
          }
          system("pause");
          return 0;
      }
    
  • 3.宏替换2

      #include "stdafx.h"
      #include <stdlib.h>
      
      //typedef 是取别名 他跟 #define 是不同的
      //#define宏定义:标识符 字符串
      //字符串替换
      
      #define MAX(x,y) ((x)>(y))?x:y;   
      
      int main(){
          int max = MAX(3,5);
          printf("%d\n", max);
      
          system("pause");
          return 0;
      }
    
  • 4.头文件引入(#include <> 与 #include "")

1> "" 表示自己创建的头文件,没有包含在调试源文件中的

2> <> 表示在包含文件目录中去查找,即配置在了调试源文件中的头文件

  • 5.条件编译(#ifdef 和 #endif)

      #include "stdafx.h"
      #include <stdlib.h>
      
      //#define M
      int main(){
          //#ifdef 跟 #endif 是成对出现的
          //如果定义了#define M 就打印110,如果没有定义宏#define M 就打印120
      #ifdef M
          printf("%d\n", 110);
      #else
          printf("%d\n", 120);
      #endif
      
          system("pause");
          return 0;
      }
    
  • 6.更多关于宏定义

详细笔记: day05_ndk_宏定义笔记.doc

    C 语言执行的流程:
    无参宏定义
    带参宏定义
    文件包含
    #include <> 或者 #include “” 区别
    条件编译              
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容