简单的方法把二进制数据写入文件

Falleyes 2014-05-22 05:27:39
这是一个哈夫曼编码的练习,其中要求将一篇文章按照哈夫曼编码编码后写入文件。那么现在就有一个问题,每个字母的二进制码长度不一样,如果写入文件,我的做法是对unsigned char变量进行位运算,将二进制数据字符对应的二进制位依次推入这个变量,推入满8位将这8个二进制位用fputc写入文件。
请问还有更好的方法吗?
...全文
408 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Falleyes 2014-05-24
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
还可以用bitset
我知道bitset,但现在课程实验在用C。。。貌似没有更好的办法了,结贴。
赵4老师 2014-05-23
  • 打赏
  • 举报
回复
还可以用bitset
躺着睡的蜗牛 2014-05-22
  • 打赏
  • 举报
回复
哈夫曼哈夫曼码最长如果为16个, 可以考虑用32位编码缓存数据。 编码的时候直接把编码缓存数据移位, 把生成的哈夫曼码放到数据中。 当缓存数据超过16位的时候, 把整Byte数据保存, 编码缓存数据移位。 编码结束时, 把剩余的数据保存。
Falleyes 2014-05-22
  • 打赏
  • 举报
回复
引用 2 楼 jmppok 的回复:
最简单的: 每个编码写一行
不清楚你的每个编码写一行是什么意思?每个编码长度不同,你要写进文件,每1个字节可能包含的字符也是不一样的。可能包含两个字符,可能包含一个半,可能是半个,也可能是几分之一个。
jmppok 2014-05-22
  • 打赏
  • 举报
回复
最简单的: 每个编码写一行
赵4老师 2014-05-22
  • 打赏
  • 举报
回复
仅供参考
//有一个二进制文件,要求每隔50bits,删除后面的12bits。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fi,*fo;
char buf[31];
char obf[31];
int bn,n;
void filter() {//对buf中前n个字节中的位,每隔50bits,忽略12bits,结果放在obf中,且将bn设置为obf中的字节数。
    char bit[249];
    char obt[249];
    char b8[33];
    char b88[33];
    int i,j;
    char *e;

    for (i=0;i<n;i++) {
        _itoa(buf[i],b8,2);
        sprintf(b88,"%032s",b8);
        sprintf(bit+i*8,"%s",b88+24);
    }

    j=0;
    for (i=0;i<n*8;i++) {
        if (i%62<50) {
            obt[j]=bit[i];
            j++;
        }
    }
    if (j%8) {
        bn=(j/8+1)*8;
    } else {
        bn=j;
    }
    for (i=j;i<bn;i++) obt[i]='0';
    obt[bn]=0;
    bn=bn/8;
    for (i=0;i<bn;i++) {
        strncpy(b8,obt+i*8,8);b8[8]=0;
        obf[i]=(char)strtol(b8,&e,2);
    }
}
int main() {
    fi=fopen("in.bin","rb");
    if (NULL==fi) {
        printf("Can not open file in.bin!\n");
        return 1;
    }
    fo=fopen("out.bin","wb");
    if (NULL==fo) {
        fclose(fi);
        printf("Can not open file out.bin!\n");
        return 2;
    }
    while (1) {
        n=fread(buf,1,31,fi);
        if (0==n) break;
        filter();
        fwrite(obf,1,bn,fo);
    }
    fclose(fo);
    fclose(fi);
    return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧