You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言如何读取文件比特位并重写以完整再生原文件

核心原理

先讲最基础的事实:操作系统的文件IO接口最小操作单位是字节(1字节=8比特),不存在“直接单独读取1个比特”的系统调用。你要拿到每个比特的0/1值,本质上也是先把整字节读进内存,再通过位运算拆成单个比特。
如果目标是无损再生原文件,根本没必要拆到比特级——只要用二进制模式打开文件,按块读写字节内容,就能得到和原文件逐字节完全一致的副本,不会有任何差异。要是硬拆成比特再重组,反而容易因为位顺序搞错损坏文件,效率还极低。

实现步骤
  • 打开源文件myfile.txt时必须用rb(二进制只读)模式,绝对不能用默认的文本模式r,否则Windows平台会自动把换行符\n替换成\r\n,直接导致文件内容不一致
  • 打开目标写入文件时用wb(二进制写入)模式,同理避免文本模式的自动转义问题
  • 用固定长度的内存块做缓冲区循环读写,不要逐字节读,效率太差,4KB大小的缓冲区是兼顾性能和内存占用的通用选择
  • 读多少内容就写多少内容,读到文件末尾立刻终止循环,最后关闭两个文件句柄就完成复制
可直接运行的复制示例代码
#include <stdio.h>
#include <stdlib.h>

#define BUF_SIZE 4096 // 4KB缓冲区,和系统内存页大小对齐,读写效率最高

int main() {
    FILE *src_fp = fopen("myfile.txt", "rb");
    if (src_fp == NULL) {
        perror("打开源文件失败");
        return EXIT_FAILURE;
    }

    FILE *dest_fp = fopen("myfile_copy.txt", "wb");
    if (dest_fp == NULL) {
        perror("打开目标文件失败");
        fclose(src_fp);
        return EXIT_FAILURE;
    }

    unsigned char buf[BUF_SIZE];
    size_t read_len;
    // 循环读取,每次最多读BUF_SIZE个字节
    while ((read_len = fread(buf, 1, BUF_SIZE, src_fp)) > 0) {
        // 实际读了多少字节就写多少字节,不多写
        fwrite(buf, 1, read_len, dest_fp);
    }

    // 释放文件资源
    fclose(src_fp);
    fclose(dest_fp);

    printf("文件复制完成,生成的副本与原文件完全一致\n");
    return EXIT_SUCCESS;
}
如需逐比特读取处理的实现方法

如果你的需求不只是复制,还要拿到每个比特的0/1值做自定义处理(比如比特分析、加解密),可以在读取到字节之后用位运算拆位,处理完成后再把8个比特按原顺序拼成1个字节写入目标文件即可。
拆取单个字节比特位的示例:

unsigned char byte;
// 先从源文件读入1个字节到byte变量
fread(&byte, 1, 1, src_fp);
// 从高位到低位依次取出8个比特
for (int offset = 7; offset >= 0; offset--) {
    int bit_val = (byte >> offset) & 1;
    // bit_val就是当前位的0/1值,可在此处做自定义处理
}

重要提醒:拆位处理后重组字节时,必须严格保持原有的比特顺序,只要错1位,整个文件的内容就会完全错乱。如果只是为了复制文件,完全没必要做这层拆位操作,直接按块读写的方式稳定性和效率都高得多。

内容的提问来源于stack exchange,提问作者dickson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:34:23