C语言多线程,块读取,加/解密文件

头文件

使用的头文件是threads.h编译标准需c11以上

#include <threads.h>

定义宏和结构体

#define BLOCK_SIZE 10485760 //块读取的大小,这里为10mb
#define NUM_BLOCKS 3        //线程开辟数

typedef struct {
    char* block;            //读取到的数据
    int len;                //fread读到的长度,防止长度不足时输出乱码
} Data;

线程函数

// 假设的加密函数
void encrypt_block(Data* data) {
    // 实现加密逻辑
    for (int i = 0; i < data->len; ++i) {
        data->block[i] ^= 0x0F; // 示例加密操作
    }
}

// 线程函数
int thread_function(void* arg) {
    Data* data = (Data*)arg;
    encrypt_block(data);
    return 0;
}

main函数

int main() {
    FILE* file = fopen("encrypted.txt", "rb");
    if (file == NULL) {
        perror("Error opening file");
        return EXIT_FAILURE;
    }
    Data data[NUM_BLOCKS];
    // 读取文件块
    for (int i = 0; i < NUM_BLOCKS; ++i) {
        data[i].block = malloc(BLOCK_SIZE);
        if (data[i].block == NULL) {
            perror("Memory allocation failed");
            fclose(file);
            return EXIT_FAILURE;
        }
        //获取实际输入长度
        data[i].len = fread(data[i].block, 1, BLOCK_SIZE, file);

    } 
    fclose(file);

    // 创建线程
    thrd_t threads[NUM_BLOCKS];
    for (int i = 0; i < NUM_BLOCKS; ++i) {
        //printf("%d\n", strlen(blocks[i]));
        //if(strlen(blocks[i]))

        if (thrd_success != thrd_create(&threads[i], thread_function, &data[i])) {
            perror("Thread creation failed");
            return EXIT_FAILURE;
        }
    }

    // 等待线程完成
    for (int i = 0; i < NUM_BLOCKS; ++i) {
        thrd_join(threads[i], NULL);
    }

    // 写入新文件
    FILE* new_file = fopen("encrypted.txt", "wb");
    if (new_file == NULL) {
        perror("Error opening new file");
        for (int i = 0; i < NUM_BLOCKS; ++i) {
            free(data[i].block);
        }
        return EXIT_FAILURE;
    }
    for (int i = 0; i < NUM_BLOCKS; ++i) { 
        if (data[i].len > 0)
            fwrite(data[i].block, data[i].len, 1, new_file);
        if(!data[i].block)
            free(data[i].block); // 释放内存
    }
    fclose(new_file);

    return EXIT_SUCCESS;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值