首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++之文件

C++之文件

作者头像
包子388321
发布2020-06-16 09:49:27
7850
发布2020-06-16 09:49:27
举报
文章被收录于专栏:包子的书架包子的书架

C++ 文件处理

官方文档:http://www.cplusplus.com/reference/cstdio/fopen/ 相关内容简介

  • fopen方法的介绍
  • 文本文件读取
  • 写入文本文件
  • 二进制文件读写
  • 读取文件大小
  • 文本文件加解密
  • 二进制文件的加解密

fopen

fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息

FILE *fopen(const char *filename, const char *mode)

filename:文件的路径 mode:表示打开文件的模式,如下图:

mode类别.png

二进制文件和文本文件读写的区别: 写文本 '\n’-> \r\n 读文本 \r\n -> \n

文本文件读取

test.txt:

这只是一个单纯的文件
用来测试的,不要想多了。

栗子代码:

int main()
{
    char *path = "D:\\NDK\\class\\files\\test.txt";  //必修使用两个\\ 否则会报错
    
    FILE *fp = fopen(path, "r");
        
    if (fp == NULL) {
         printf("文件不存在,或者加载文件失败...");
         return 0;
    }

    char buff[500];
    while (fgets(buff, 50, fp))
    {
         printf("%s", buff);
     }

    fclose(fp);
    system("pause");
    return 0;
}

写入文本文件

test.txt 还是上面的文件 栗子代码:

int main() {

    char *path = "D:\\NDK\\class\\files\\test.txt";
    FILE *fp = fopen(path, "w");

    if (fp == NULL) {
        printf("failed。。。。");
        return 0;
    }
    
    char *text = "C++开发,我看好你";
    fputs(text, fp);
    fclose(fp);


    system("pause");
    return 0;
}

二进制文件读写

实现一个exe文件读取,再进行输出到新的路径 用到了fread和fwrite两个读和写的方法

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

从给定流 stream 读取数据到 ptr 所指向的数组中

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

把 ptr 所指向的数组中的数据写入到给定流 stream 中

栗子代码:

int main() {
    char * read_path = "D:\\NDK\\class\\files\\testPro.exe";
    char * write_path = "D:\\NDK\\class\\files\\testPro_write.exe";

    //read 
    FILE * read_fp = fopen(read_path, "rb");   //rb 表示读取二进制
    //write
    FILE * write_fp = fopen(write_path, "wb");  //wb 表示写入二进制
    char buff[50];
    int len = 0;
    while ((len = fread(buff, sizeof(char), 50, read_fp)) != 0) 
    {
        fwrite(buff, sizeof(char), len, write_fp);
    }
    fclose(read_fp);
    fclose(write_fp);
    system("pause");
    return 0;
}

读取文件大小

先看两个方法:

  1. fseek :设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
int fseek(FILE *stream, long int offset, int whence)

stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。 offset -- 这是相对 whence 的偏移量,以字节为单位。 whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:

whence.png

  1. ftell:返回给定流 stream 的当前文件位置。
long int ftell(FILE *stream)

栗子代码:读取图片文件的大小

int main() {
    char *read_path = "D:\\NDK\\class\\files\\beauty.png";

    FILE *fp = fopen(read_path, "r");
    if (fp == NULL)
    {
        return 0;
    }

    fseek(fp, 0, SEEK_END);  //表示文件指向文件末尾
    long  filesize = ftell(fp);  //获取当前文件位置

    printf("%ld \n", filesize);

    system("pause");
    return 0;
}

文本文件加解密

异或算法:不相同的为1,相同为0 1001 ^ 0111 = 1110 1110 ^ 0111 = 1001

加密上面的test.txt文件,代码:

void encode(char normal_path[], char encode_path[]) {
    FILE * normal_fp = fopen(normal_path, "r");
    FILE * encode_fp = fopen(encode_path, "w");

    int ch;
    while ((ch = fgetc(normal_fp)) != EOF){
        fputc(ch ^ 7, encode_fp);
    }
    fclose(normal_fp);
    fclose(encode_fp);
}

void decode(char encode_path[], char decode_path[]) {
    FILE * normal_fp = fopen(encode_path, "r");
    FILE * encode_fp = fopen(decode_path, "w");

    int ch;
    while ((ch = fgetc(normal_fp)) != EOF) {
        fputc(ch ^ 7, encode_fp);    
    }
    fclose(normal_fp);
    fclose(encode_fp);
}

int main() {
    char * nomal_path = "D:\\NDK\\class\\files\\test.txt";
    char * encode_path = "D:\\NDK\\class\\files\\test_encode.txt";
    char * decode_path = "D:\\NDK\\class\\files\\test_decode.txt";
    //encode(nomal_path, encode_path);
    decode(encode_path, decode_path);
    system("pause");
    return 0;
}

二进制文件的加解密

这边采用的传进加密密码,加密和解密的密码必须一致,否则,无法解密出来

void biEncode(char normal_path[], char encode_path[], char * password) {
    FILE * normal_fp = fopen(normal_path, "rb");
    FILE * encode_fp = fopen(encode_path, "wb");

    int ch;
    int pwd_legth = strlen(password);
    int i = 0;
    while ((ch = fgetc(normal_fp)) != EOF){
        fputc(ch ^ password[i % pwd_legth], encode_fp);
        i = (i++) % 10001;
    }
    fclose(normal_fp);
    fclose(encode_fp);
}

void biDecode(char encode_path[], char decode_path[], char * password) {
    FILE * normal_fp = fopen(encode_path, "rb");
    FILE * encode_fp = fopen(decode_path, "wb");

    int ch;
    int pwd_legth = strlen(password);
    int i = 0;
    while ((ch = fgetc(normal_fp)) != EOF) {
        fputc(ch ^ password[i % pwd_legth], encode_fp);
        i = (i++) % 10001;
    }
    fclose(normal_fp);
    fclose(encode_fp);
}
int main() {
    char * nomal_path = "D:\\NDK\\class\\files\\beauty.png";
    char * encode_path = "D:\\NDK\\class\\files\\beauty_encode.png";
    char * decode_path = "D:\\NDK\\class\\files\\beauty_decode_.png";

    biEncode(nomal_path, encode_path, "ILoveYou");
    biDecode(encode_path, decode_path, "ILoveYou");

    system("pause");
    return 0;
}

结语

以上就是C++的文件相关操作,只是为了记录知识点,也欢迎大家阅读和错误指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++ 文件处理
    • fopen
      • 文本文件读取
        • 写入文本文件
          • 二进制文件读写
            • 读取文件大小
              • 文本文件加解密
                • 二进制文件的加解密
                  • 结语
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档