C 从字符串到二进制文件

C 从字符串到二进制文件,c,file,C,File,我有个问题,我需要在C语言的文本文件中写入位。 我想保存一个大小为5字节的字符串 char code[] = "0110"; 在一个文件中,一点一点地,这样最终的文件大小只有4位 Input: size(file) = 5 bytes. Output: size(file) = 4 bits. char *in = "0110"; char out = 0; int i = 0; while (in[i] != '\0') { out = out * 2 + in

我有个问题,我需要在C语言的文本文件中写入位。
我想保存一个大小为5字节的字符串

char code[] = "0110";
在一个文件中,一点一点地,这样最终的文件大小只有4位

Input:  size(file) = 5 bytes.
Output: size(file) = 4 bits.
  char *in = "0110";
  char out = 0;

  int i = 0;
  while (in[i] != '\0') {
    out = out * 2 + in[i] - '0';
    i++;
  }

  // Write out in your file.

我的问题是:C中是否有一个函数(例如fwrite())可以做到这一点?

尝试将表示二进制数的字符串转换为字符,然后在文件中写入字节

因为你不能只写4位,所以你会有一些开销

Input:  size(file) = 5 bytes.
Output: size(file) = 4 bits.
  char *in = "0110";
  char out = 0;

  int i = 0;
  while (in[i] != '\0') {
    out = out * 2 + in[i] - '0';
    i++;
  }

  // Write out in your file.
C API将(合理地)不允许您将4位写入文件。 我也不认为有一个文件系统可以将内容记录为半字节! 这只是说,您要做的是将
1
s和
0
s字符串解释为一个字节中的一组位

为了做到这一点,你必须写位。 这通常通过位运算符实现

因此,例如,如果您有一个8字节的“流”
10011100
,您可以用以下代码打包一个字节:

char *sb = "10011100";
unsigned char next = 0;  // Next bit to process
unsigned char pos = 0;   // Position of next bit
unsigned char byte = 0;  // Where to store the result
for (i = 0; i < 8; i++) {
    if ((*sb) == '1') {
        next = 0x01;
    }
    else {
        next = 0x00;
    }
    byte |= next << pos;
    pos++;
}
char*sb=“10011100”;
无符号字符next=0;//下一个要处理的位
无符号字符pos=0;//下一位的位置
无符号字符字节=0;//在哪里存储结果
对于(i=0;i<8;i++){
如果((*sb)='1'){
next=0x01;
}
否则{
next=0x00;
}

byte |=下一步,我怀疑任何文件系统都允许位的大小。你可能会有额外的开销。你能提供更多的视角来解释你为什么要这样做吗?你可以将它转换成
int
char
,然后写入文件。这些老师在他们的家庭作业问题上变得更有想象力了!stackoverflow是一个Q&一个站点。你的问题是什么?@ouah-我猜问题是“我不能被强迫做作业,你能帮我做吗?”不仅任何文件系统都不能让你写少于一个字节,而且绝大多数文件系统都使用整个块(比如4KB)对于任何文件,无论多么小。非常感谢,似乎这是唯一的解决方案:)。@user2536844我编辑过,因为你解释说这是为了实现哈夫曼,这个问题不是直接的家庭作业:)。非常感谢,我对这个问题有更广泛的看法。