【发布时间】: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