在C中填充0s的2GiB文件

时间:2016-01-23 11:36:30

标签: c

我即将在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位。

我觉得我必须错过一些平凡的细节。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

你正在计算0xffffffff,等于4,294,967,295。对于2 GB的数据,您最多可以计算0x80000000