我有以下C代码以rb+
模式打开文件,然后写入100个字节的值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上。
答案 0 :(得分:0)
您可能想要类似的东西:
int i; for (i=0;i<100;++i){fwrite(&zero, 1, 1, fp);}
您不能从指向单个字符的指针写入100个字节。
答案 1 :(得分: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);
这可以更好地扩展,但性能却很差,因为执行单个大写操作总是比许多小写操作效率更高。相反,您可以搜索文件中的更高位置,然后仅写入最后一个字节。 On POSIX systems, this is guaranteed用零填充文件的较早未写部分:
char zero = 0;
fseek(f, 99, SEEK_SET);
fwrite(&zero, sizeof(char) /* == 1 */, 1, f);
我相信 Windows的MSVCRT运行时也提供了零填充保证,但是我不能立即在MSDN上找到证明(这可能是一个很好的问题)。如果有人知道Windows,其他平台和/或某些版本的C标准本身是否做出此保证,则可以改进此答案。
当然,如果您 在POSIX系统上并且不需要可移植的代码,则可以使用ftruncate()
做出相同的保证,甚至不需要做{{1 }}。 Windows有SetEndOfFile()
但,该功能使用未定义值(而不是零字节)填充文件的扩展部分。