【问题标题】:Printing bits in a buffer with C?用C在缓冲区中打印位?
【发布时间】:2014-06-25 00:31:28
【问题描述】:

在 C 语言中,一次向文件写入和读取特定位数的最佳方法是什么,例如前 16 位或整数下半部分的 12 位。除了使用 fwrite 之外,我似乎找不到任何线程或文档。我可能不确定,但我认为我不能写入特定数量的位,并且需要一个缓冲区,但任何人都可以指导我以正确的方式执行此操作吗?

【问题讨论】:

  • 不,您不能写入任意数量的位。一个完整字节是您可以写入的最小数据量。
  • 使用按位运算和移位将位存储在一个字节中。该字节将充当缓冲区。一旦字节中“推送”的位数达到 8[*],您可以将字节输出到文件并重新开始。如果最后一位小于 8[*] [*] 或您机器上的任何限制,您显然必须刷新最后一个字节。

标签: c io fwrite


【解决方案1】:

使用可用的 API,您一次可以在文件中写入的最小信息量是 1 个字节。要实现您想要的,您必须从文件中读取字节,使用按位运算符对其进行修改并将其写回文件。如果您将数据作为流写入,则必须在每个字节完成或完成后调用 fwrite。鉴于文件系统将以字节为单位跟踪文件大小,因此您必须用更合适的零或一填充最后一个字节。否则,需要一个提供位级操作的文件系统和相应的操作系统级支持。

事实上,可以写入磁盘的最小物理数据量是 512 字节的扇区,最近是 4096 字节。在文件系统级别,几个扇区捆绑在一起形成一个块。操作系统“隐藏”了这一事实并允许我们处理单个字节。

使这个问题听起来愚蠢的原因是我们已经习惯了当前的文件抽象,以至于它已经成为第二天性。然而,在幕后有很多东西支持这种错觉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多