【问题标题】:Writing a byte(which may not correspond to an ASCII character) to a file in C将字节(可能不对应于 ASCII 字符)写入 C 中的文件
【发布时间】:2014-04-22 10:04:12
【问题描述】:

我正在用 C 语言编写一个压缩程序。它使用运行长度和 Rice golomb 编码,应用于位级别。我已经编写了程序,当我在屏幕上打印出 1 和 0 时,它们都是正确的。但是我需要能够获取一个文件,压缩它并将其输出到另一个文件。

所以我试图做的是将位存储到一个字符中,当我收到它们时,一旦我添加了 8 位,我就会将它打印到新文件中。这对我不起作用。没有任何内容输出到文件中。我认为问题在于某些字节,显然不会对应于任何 ASCII 字符。请问有什么建议吗?

这是我的代码,收到一点,将它添加到一个字符,然后将字符打印到文件一次,它是'填充'

void writeByte(char byte){
    FILE *comp;
    comp = fopen("compfile.txt" "wb");
    fprintf(comp,"%c", byte);
    putc(byte,comp);
    putchar(byte);
    printf("%c\n",byte);
}

void writeBit(int bit){
    if(ind >= 0){
        byte|=(bit<<ind);
        ind--
    }
    else{//if byte full
        writeByte(byte); //write a byte to file;
        reset();
        writeBit(bit);
    }
}

【问题讨论】:

  • 你到底为什么要为你想写的每个字节重新打开文件?!
  • 如果你关闭它会有所帮助。

标签: c file compression byte


【解决方案1】:

fputc 似乎是在这里使用的最佳选择,因为您一次只写入一个字符而不是整个缓冲区(fwrite 所做的),并且可以节省解析格式字符串的开销(在fprintf)。

fprintf(comp,"%c", byte); 替换为fputc(byte, comp);

对您的代码的其他建议:

  1. 不要fopen 每次要向文件中写入字符时@ 同一个文件。您最终可能会花费 2 倍于打开文件的资源,而不是实际写入文件。打开一次并传入文件描述符。
  2. 您可能应该以不同的方式命名您的byte 变量。 byte 是 C++ 中的一个特殊关键字。即使您的代码是 C 语言,而且您可能永远不需要在 C++ 代码中使用它,但它可能会让一些阅读您的代码的人感到困惑。

【讨论】:

  • 我不认为 byte 是 C++ 中的关键字。
【解决方案2】:

当您调用fopen("compfile.txt", "wb"); 时,现有文件(如果有)将被截断为零长度。要做到这一点,您需要在程序开始时打开文件一次,然后在程序结束时打开文件fclose

另外,要查看文件,您需要使用十六进制编辑器。

【讨论】:

  • 谢谢!,我使用了 fputc,并通过了文件而不是在方法中打开它,正如你们所建议的那样,它有效。
猜你喜欢
  • 2014-04-04
  • 1970-01-01
  • 2022-01-10
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2011-11-28
  • 2016-02-28
相关资源
最近更新 更多