【问题标题】:Filling a 2GiB file with 0s in C在 C 中用 0 填充 2GiB 文件
【发布时间】:2016-01-23 11:36:30
【问题描述】:

我即将用 C 进行一些数据处理,处理部分在逻辑上工作,但我遇到了一个奇怪的文件问题。我方便地考虑 32 位数字,所以我需要一个 32 位 0 的文件,然后如果有限域中存在某些东西,我会将 0 更改为 1。

我的问题是:用 C 语言制作全“0”的文件的最佳方法是什么?

我目前正在做的事情似乎有道理,但没有奏效。我目前正在执行以下操作,并且不会停留在 2.4GiB 标记处。我不知道出了什么问题或者是否有更好的方法。

#include <stdlib.h>
#include <stdio.h>

typedef uint8_t u8;
typedef uint32_t u32;

int main (int argc, char **argv) {

    u32 l_counter32 = 0;
    u8  l_ubyte = 0;
    FILE *f_data; 

    f_data = fopen("file.data", "wb+");
    if (f_data == NULL) {
        printf("file error\n");
        return(0);
    }
    for (l_counter32 = 0; l_counter32 <= 0xfffffffe; l_counter32++) {
        fwrite(&l_ubyte, sizeof(l_ubyte), 1, f_data);   
    }
    fwrite(&l_ubyte, sizeof(l_ubyte), 1, f_data);   //final byte at 0xffffffff
    fclose(f_data);
}

我将循环中的计数器递增为 0xFFFFFFFe,这样它就不会回绕并永远运行。我实际上并没有等待它停止,我只是通过 ls -alF 继续检查磁盘和当它大于 2.4GiB 时,我停止它。我检查了sizeof(l_ubyte),确实是8位。

我觉得我一定遗漏了一些平凡的细节。

【问题讨论】:

  • 好吧,要让文件填充零,可以使用sparse files,因此整个文件将使用单个lseek/fseek 和单个write/fwrite 写入。
  • 0xFFFFFFFF 等于 4294967295,大约是 4 GB,而不是 2。
  • 对稀疏文件使用 lseek:手册页 (man7.org/linux/man-pages/man2/lseek.2.html) 提到“这些操作允许应用程序在稀疏分配的文件中映射漏洞。”
  • 稀疏文件没有得到普遍支持,OP 没有具体说明他们使用的操作系统。

标签: c


【解决方案1】:

您数到0xffffffff,等于 4,294,967,295。您希望精确到 0x80000000 的 2 GB 数据。

【讨论】:

    【解决方案2】:

    使用零(别名 \0 空字节)创建初始化文件的更快方法是使用 truncate()/ftruncate()。见man page here

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 1970-01-01
      • 2013-04-13
      • 2016-11-19
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2021-07-06
      相关资源
      最近更新 更多