-1

我有以下 C 代码以rb+模式打开文件,然后写入 100 字节的 value 0。当我读取偏移量不是 0 的文件时,我得到 96。这是为什么呢?

FILE *fp = fopen("myfile", "rb+");
rewind(fp);
char zero = 0;
fwrite(&zero, 1, 100, fp);
char result;
fseek(fp, 1, SEEK_SET);
fread(&result, 1, 1, fp);
printf("%d\n", result);

我在使用 GCC 的 Linux x64 上。

4

2 回答 2

0

你可能想要这样的东西:

int i; for (i=0;i<100;++i){fwrite(&zero, 1, 1, fp);}

您不能从指向单个字符的指针写入 100 个字节。

于 2018-12-09T03:58:26.080 回答
0

根据您在评论中的说明,您的意图是将 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()

于 2018-12-09T04:05:24.993 回答