美文网首页
NDK-011: C6: 文件操作

NDK-011: C6: 文件操作

作者: xqiiitan | 来源:发表于2024-12-31 19:32 被阅读0次

1.读取文本文件。

fopen 打开文件
fgets 读取文本文件
fputs 文件写入
fclose 关闭文本
fread 读。返回 读取到的字节数。
fwrite 写。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main(){
    // 打开文件 (文件名,模式)mode: r(读) w(写) rb(作为二进制读) wb(作为二进制写)
    // FILE *fopen( const char *filename, const char *mode );
    // char* fileName = "C:\\Users\\hcDarren\\Desktop\\android\\NDK\\Simple.txt";
    char* fileName = "C:\\Users\\Simple.txt";
    FILE *file = fopen(fileName, "r"); // 打开文件,读。

    if (!file){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    char buffer[10]; // 缓冲区
    // 缓冲区buffer; 长度10; 文件指针
    while (fgets(buffer, 10, file)) { // 未读取到文件尾,循环读取。
        printf("%s", buffer);
    }
    fclose(file); // 关闭文件
    // getchar();
}
// 文件写入
void main(){
    char* fileName = "C:\\Users\\Simple_Write.txt";
    FILE *file = fopen(fileName, "w");
    if (!file){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    fputs("I am Darren", file);
    // 关闭文件
    fclose(file);
    getchar();
}

2. 拷贝文件:当做的二进制文件来操作

文件复制:当做二进制文件来操作。

void main(){
    char* fileName = "C:\\Users\\hcDarren\\Desktop\\android\\NDK\\image.jpg";
    char* fileCopyName = "C:\\Users\\hcDarren\\Desktop\\android\\NDK\\image_copy.jpg";

    FILE *file = fopen(fileName, "rb");// 二进制流的指针
    FILE *file_copy = fopen(fileCopyName, "wb");// 新建一个文件 0kb 
    if (!file || !file_copy){
        printf("文件打开失败");
        exit(0);// 退出程序
    }

    // size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
    int buffer[512]; // 缓冲大小:2048字节 = 4字节*512
    int len;
    printf("buffer size: %d", sizeof(buffer)); // sizeof(buffer)= sizeof buffer。值:2048
    while ((len = fread(buffer, sizeof(int), 512, file)) !=0){ // 循环,一边读一边写。
        fwrite(buffer, sizeof(int), len, file_copy); // 读取多少字节,写入多少字节。
    }
    fclose(file); // 关闭文件
    fclose(file_copy);
    getchar();
}
// 获取文件的大小:fseek,ftell
// 思路:将文件的指针移动到最后,然后再去计算偏移量,从而得到文件大小。
void main(){
    char* fileName = "C:\\Users\\hcDarren\\Desktop\\android\\NDK\\image.jpg";
    FILE *file = fopen(fileName, "rb");// 流指针,打开文件。
    if (!file){
        printf("文件打开失败");
        exit(0);// 退出程序
    }
    // 没有一个函数是可以直接拿文件大小
    // 思路:将文件的指针移动到最后,然后再去计算偏移量
    // 三个参数:  SEEK_SET(移动到开头), SEEK_CUR(移动到当前), SEEK_END(移动到最后)
    fseek(file, 0, SEEK_END); // 1.将文件指针移动到哪里去。

    // 2.计算偏移的位置, ftell 从 0开始统计到当前(SEEK_END文件末尾)
    long file_size = ftell(file);
    printf("文件大小:%ld", file_size);
    fclose(file);
    getchar();
}

3.文件加密与文件切割。

使用第三方文件服务器,上传速度快,为了防止图片泄密,采取对图片加密。
客户端显示的时候,先解密再显示。
思路:让别人打不开图片。
把每个字节都拿出来,对每个字节都处理;把某部分字节拿出来,进行处理。
字节+一个数5(解密的时候-5);字节异或^一个数5(解密的时候,同样的异或5)。
只修改前面一个字节。

// 加密
void main() {
    char* fileInName= "C:\\NDK\\image.jpg";
    char* fileOutName= "C:\\NDK\\image_en.jpg";

    File* fpIn = fopen(fileInName, "rb");
    File* fpOut = fopen(fileOutName, "wb");
    if(!fpIn || !fpOut){
        printf("文件打开失败");
        exit(0); // 退出程序
    }
    
    int c;
    while((c = fegtc(fpIn)) != EOF) {
        fputc(c^5, fpOut);
    }
    fclose(fpIn);
    fclose(fpOut);
}
// 解密
void main() {
    char* fileEnName= "C:\\NDK\\image_en.jpg";
    char* fileDeName= "C:\\NDK\\image_de.jpg";

    File* fpIn = fopen(fileEnName, "rb"); // 返回file流的头指针。
    File* fpOut = fopen(fileDeName, "wb"); // 创建新文件。
    if(!fpIn || !fpOut){
        printf("文件打开失败");
        exit(0); // 退出程序
    }
    
    int c;
    while((c = fegtc(fpIn)) != EOF) { // 读取一个字节
        fputc(c^5, fpOut); // 解密后,写入1字节。
    }
    fclose(fpIn);
    fclose(fpOut);
}

// 只修改一个字节。fputc(5, file); 会破坏文件,Mat矩阵可以操作。
值修改一个字节的方案行不通。

void main() {
    char* fileEnName= "C:\\NDK\\image.jpg";
    File* file = fopen(fileDeName, "wb");
    fputc(5, file);
    fclose(file);
}

// 定义字符串密码加密。

void main() {
    char* fileName= "C:\\NDK\\image.jpg";
    char* fileEnName= "C:\\NDK\\image_en.jpg";
    char* passWord = "123456"; // 轮流进行异或操作
    
    File* fp = fopen(fileName, "rb");
    File* fpEn = fopen(fileEnName, "wb");
    if(!fp || !fpEn){
        printf("文件打开失败");
        exit(0); // 退出程序
    }
    
    int c; //EOF(end of file)
    int index=0;
    int pwd_len = strlen(passWord);
    while((c = fegtc(fp)) != EOF) {
        fputc(c^ passWord[index % pwd_len], fpEn);
        index++;
    }
    fclose(fp);
    fclose(fpEn);
}
// 解密
void main() {
    char* fileEnName= "C:\\NDK\\image_en.jpg"; // 已加密的文件
    char* fileDeName= "C:\\NDK\\image_de.jpg"; // 解密后文件
    char* passWord = "123456"; // 轮流进行异或操作
    
    File* fpEn = fopen(fileEnName, "rb");
    File* fpDe = fopen(fileDeName, "wb");
    if(!fpEn || !fpDe){
        printf("文件打开失败");
        exit(0); // 退出程序
    }
    
    int c; //EOF(end of file)
    int index=0;
    int pwd_len = strlen(passWord);
    while((c = fegtc(fpEn)) != EOF) {
        fputc(c^ passWord[index % pwd_len], fpDe);
        index++;
    }
    fclose(fpEn);
    fclose(fpDe);
}

4.文件的切割, 思路类似断点下载

百度云,不是vip,不能上传 不大于4G的文件。
大文件:断点续传 + 文件切割(文件合并),

int getFileSize(char* fileName){ // 获取文件总大小
    File* file = fopen(fileName, "rb");
    if(!file) {
        return 0;
    }
    fseek(file, 0, SEEK_END);
    int fileSize = ftell(file);
    fclose(file);
    return fileSize;
}

void main() {
    // 计算每个文件需要写入多少?
    char* fileName= "C:\\NDK\\image.jpg";
    FILE* file = fopen(fileName, "rb");
    int file_size = getFileSize(fileName);
    // 切多少,计算大小,指定文件名称。
    int file_number = 3;
    // char[]就是 char* fileName:image_1.jpg, image_2.jpg, image_3.jpg...
    char** file_names = malloc(sizeof(char*) *file_number); // 二维数组开辟
    int preFileSize = file_size/ file_number; // 每份的size
    // 进行文件名称 赋值
    for(int i=0; i<file_number, i++) {
        file_names[i] = (char*)malloc(sizeof(char) *100); // 每个文件名开辟
        sprintf(file_names[i], "C:\\NDK\\image_%d.jpg", i);// 格式化字符串到file_names[i]
        printf("%s\n", file_names[i]);
    }
    for(int i=0; i<file_number; i++){
        // 从源文件中,往切割文件中写入数据。0~4,4~8,8~13.  
        FILE* cur_file = fopen(file_names[i], "wb");    
        int start = i*preFileSize;
        int end = (i+1)*preFileSize;
        if(i == file_number-1) {
            end = file_size;
        }
        // 从文件中间位置开始读取,然后写入到3个文件中。
        for(int j=start; j<end; j++) {
            // 从file中读, 写入到cur_file中。读一个字节写入一个字节。
            fputc(fgetc(file), cur_file);
        }
        fclose(cur_file);
        free(file_name[i]);
    } 
    free(file_names);
    fclose(file);
}

// TODO 合并,创建一个文件,不断写入到文件中。判断EOF。

// 将分割的文件,合并成新的全文件。创建一个文件,不断的往里面写,直到文件的EOF。

void main() {
    char* fileName = "C:\\image_result.png";
    FILE* file = fopen(fileName, "wb");

    int file_number = 3;
    // 将切割的文件,合并未一个图片。
    char** file_names = (char**)malloc(sizeof(char*) * file_number);
    // 进行复制
    int i = 0;
    for (; i < 3; i++)
    {
        file_names[i] = (char*)malloc(sizeof(char) * 100);
        sprintf(file_names[i], "C:\\image_%d.jpg", i); // 文件名 C:\\image_1.jpg
        printf("%s\n", file_names[i]);

        FILE* file_part = fopen(file_names[i], "rb"); // 

        int c;// EOF end of file
        while ((c = fgetc(file_part)) != EOF) {
            fputc(c, file);
        }

        fclose(file_part);
        free(file_names[i]);
    }

    fclose(file);
    free(file_names);
}

提升用户体验。

// 二级指针。
Student* student = &student; // 可以看成一维数组
Student s = *student;
Student s = student[0]; // 获取指针第0个位置

相关文章

  • 文件操作

    文件操作 目标 文件操作的作用 文件的基本操作打开读写关闭 文件备份 文件和文件夹的操作 一. 文件操作的作用 思...

  • 文件和目录处理相关

    文件和目录处理相关 题: 考点:文件操作/写入操作; 延伸:目录操作函数,其他文件操作; 文件读写操作 文件系统函...

  • 09-文件操作

    一、文件操作流程 a.普通文件操作流程: 打开文件 操作文件 关闭文件 b. json文件操作流程: open(文...

  • VBS文件操作

    VBS文件操作'操作文本文件,操作fso对象(文件对象操作) --------------------------...

  • 文件操作

    文件操作:打开文件、读写文件、操作文件内容 写入文件操作:(把大象装入冰箱)1.打开文件 ...

  • 代码小工蚁的#《算法图解》#学习笔记-C6广度优先搜索

    代码小工蚁的#《算法图解》#学习笔记-C6广度优先搜索C6 广度优先搜索breadth-first search ...

  • 类的补充

    一.复习 1.文件操作a.操作流程:打开文件(open),操作文件,关闭文件with open() as 文件变量...

  • 文件

    目标 文件操作的作用 文件的基本操作打开读写关闭 文件备份 文件和文件夹的操作 一. 文件操作的作用 思考:什么是...

  • 16总 正则表达式

    复习: 1.文件操作a.操作流程: 打开文件(open) --- 操作文件 --- 关闭文件(close)with...

  • 2018-09-10

    01-recode 1.文件操作a.操作流程:打开文件---》操作文件----》关闭文件with open() ...

网友评论

      本文标题:NDK-011: C6: 文件操作

      本文链接:https://www.haomeiwen.com/subject/mxiaejtx.html