C++基础三 操作文件 socket 线程 等方法

本文深入探讨了文件处理技术,包括文件拆分与合并的实现细节,利用diff和patch进行文件对比及修复的方法。同时,文章介绍了socket编程的基础知识,以及如何在多线程和多进程中高效管理文件和网络通信。
摘要由CSDN通过智能技术生成

1.操作文件

文件拆分

JNIEXPORT void JNICALL functionName(JNIEnv *env, jclass jcld, jsting pstring, jstring mstring, jint file_num){
    // 将路径转化成char* c可以处理的字符串
    const char* pstr = (*env)->GetStringUTFChars(env, pstring, NULL);
    const char* mstr = (*env)->GetStringUTFChars(env, mstring, NULL);

    // 得到分割之后的子文件的路径列表
    char ** mstrs = malloc(sizeof(char*)*file_num);
    int i = 0;
    for (; i < file_num; i++) {
        mstrs[i] = malloc(sizeof(char) * 100);
    }

    // 不断读取path文件, 循环file_num 个文件中
    int file_size = get_file_size(pstr); // 获取源文件的文件大小
    FILE *fpr = open(path, "rb");
    
    // 文件个数
    if (file_size % file_num == 0) {
        // 单个文件大小
        int part = file_size / file_num;
        i = 0;
        //
        for (; i < file_num; i++) {
            FILE *fpw = open(strs[i]);
            int j = 0;
            for (; j < part; j++) {
                fputc(get(fpr), fpw);
            }
            close(fpr);
        }
    } else {
        // 不整除
        // 单个文件大小
        int part = file_size / (file_num - 1);
        i = 0;
        //
        for (; i < file_num - 1; i++) {
            FILE *fpw = open(strs[i]);
            int j = 0;
            for (; j < part; j++) {
                fputc(get(fpr), fpw);
            }
            close(fpr);
        }
        // 最后一个    
        FILE *fpw = open(patches[file_num]-1, 'wb');
        i = 0;
        for (; I < filesize % (file_num - 1); i++) {
            fputc(fget(fpr), fpw);
        }
        fclose(fpw);
    }  
     close(fpr);
    // 释放字符串
    i = 0;    
    for (; i < file_num; i++) {
        free(mstrs[i]);
    }    
    free(mstrs);
    
    (*env)->RelesaeStringUTFChars(env, pstring, pstr);
    (*env)->RelesaeStringUTFChars(env, mstring, mstr);
} 


// 获取文件大小
int get_file_size(char *path){
    File *fp = fopen(path, "rb");
    fseek(fp, 0, SEEK_END);
    return ftell(fp);
}

文件合并

JNIEXPORT void JNICALL 方法名称(JNIEnv *env, jclass jcls, jstring pstring, jint fcount, jstring totalstr){
    // 合并之后的文件
    const char *merge_path = (*env)->GetStringUTFChars(env, totalstr, NULL);
    // 分割字文件
    const char *pattern_path = (*env)->GetStringUTFChars(env, pstring, NULL);

    // 得到分割的子文件的路径列表
    char **patches = malloc(sizeof(char*) * fcount);

    int i = 0;
    for (; i < fcount; i++) {
        patches[I] = malloc(sizeof(char) * 100);
    }
    FILE *fpw = open(merge_path);
    i = 0;
    for (; i < file_num; i++) {
        //每个文件的大小
        int filesize = get_file_size(patches[i]);
        FILE *fpr = open(patches[I], "rb");
        int j= 0;
        for (; j<filesize; j++) {
            fputc(fgetc(), fpw);
        }    
        fclose(fpr);
    }
    fclose(fpw);
}

文件处理使用diff和pach

 

2. socket

3.线程

4.进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatrixData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值