根据您在评论中的说明,您的意图是将 100 个零字节写入文件。至少有两种甚至三种方法可以做到这一点。
第一个是分配一个 100 个零初始化字节的数组,并写下:
char zeroes[100] = { 0 };
fwrite(zeroes, sizeof(char) /* == 1 */, sizeof(zeroes), f);
如果您想写入 10,000 或 10,000,000 个零字节,这不能很好地扩展。你也可以这样做:
char zero = 0;
for (int i = 0; i < 100; ++i) fwrite(&zero, sizeof(char), 1, f);
这可以更好地扩展,但性能很差,因为执行单个大写总是比许多小写更有效。相反,您可以在文件中查找稍后的位置,然后只写入最后一个字节。在 POSIX 系统上,这保证用零填充文件的早期未写入部分:
char zero = 0;
fseek(f, 99, SEEK_SET);
fwrite(&zero, sizeof(char) /* == 1 */, 1, f);
我相信Windows 的 MSVCRT 运行时也提供了零填充保证,但我无法立即在 MSDN 上找到证明(这可能是个好问题)。如果有人知道 Windows、其他平台和/或 C 标准的某些版本本身是否做出此保证,则可以改进此答案。
当然,如果您在POSIX 系统上并且不需要可移植代码,您可以使用ftruncate()
which 做出相同的保证,甚至不需要执行fwrite()
. Windows 有,但该函数用未定义的值填充文件的扩展部分,而不是零字节。SetEndOfFile()