【发布时间】:2014-03-12 11:50:36
【问题描述】:
我的座右铭是在系统负载最小的情况下将一些虚拟数据写入文件。数据的大小是未知的,并在运行时指定。
为此,我可以想到 2 个解决方案。
1) 使用动态内存分配
reserve_size_in_file (int reserve_size, FILE *fp)
{
char *p
p = malloc(reserve_size)
fwrite(p, sizeof(*p), 1, fp);
free(p);
}
2) 使用数组
reserve_size_in_file (int reserve_size, FILE *fp)
{
char arr[reserve_size];
fwrite(arr, sizeof(arr), 1, fp);
}
我认为第二种方法不能用作声明具有可变长度的数组(ewww...),我认为是不允许的。但它正在工作。现在我的问题是,这样使用它可以吗?另外,如果有另一种更好的方法来做到这一点,请提出建议。
注意:我不能使用fallocate(),因为我只需要处理流 IO。
编辑:
我刚刚看到我可以使用 fileno(fp) 和 fallocate()。但是我没有看到很多使用 fallocate() 的应用程序。使用 fallocate() 有什么顾虑
例如:fallocate(fileno(fp), 0, 0, 100000);
【问题讨论】:
-
在选项 1 中,您正在泄漏内存。你需要
free()分配给malloc()的内存。 -
@GrahamBorland 已更新。谢谢。
-
它真的需要消耗存储量还是可以接受的稀疏文件?
-
对不起@datenwolf 我不太明白你问的问题。对不起我糟糕的英语。在我的用户可以保留任意数量的数据。我应该准备好直到 20 MB。
-
@Manty:在大多数操作系统上,文件可能是“稀疏的”,即文件的长度与实际存储在其中的字节数不同。其中可能有漏洞,当您读取它们时,它们会以 NUL 字节出现,但实际上并未存储在存储设备上。如果您希望稍后用实际数据填充文件并且不想等待操作系统实际分配存储设备上的字节,则为文件保留存储空间是有意义的。 –– 如果您不需要预先分配实际存储空间,您可以使用
fseek(fp, SEEK_SET, offset);在流中的任何位置写入数据