FILE结尾*指针不等于写入数据的大小

非常简单地说,我有以下代码片段:

FILE* test = fopen("C:\\core.u", "w"); printf("Filepointer at: %d\n", ftell(test)); fwrite(data, size, 1, test); printf("Written: %d bytes.\n", size); fseek(test, 0, SEEK_END); printf("Filepointer is now at %d.\n", ftell(test)); fclose(test); 

它输出:

 Filepointer at: 0 Written: 73105 bytes. Filepointer is now at 74160. 

这是为什么? 为什么写入的字节数与文件指针不匹配?

由于您在文本模式下打开文件,它会将行尾标记(如LF)转换为CR / LF。

如果您在Windows上运行(可能是因为您的文件名以"c:\"开头),这很可能就是这样。

如果你以"wb"模式打开文件,我怀疑你会发现这些数字是相同的:

 FILE* test = fopen("C:\\core.u", "wb"); 

C99标准在7.19.5.3 The fopen function有这个说法7.19.5.3 The fopen function

参数模式指向一个字符串。 如果字符串是以下之一,则文件在指示的模式下打开。 否则,行为未定义。

r打开文本文件进行阅读
w截断为零长度或创建用于写入的文本文件
附加; 打开或创建文本文件以便在文件结尾处写入
rb打开二进制文件进行读取
wb截断为零长度或创建二进制文件进行写入
ab追加; 打开或创建二进制文件,以便在文件结尾处写入
r+打开文本文件进行更新(读写)
w+截断为零长度或创建文本文件以进行更新
a+追加; 打开或创建文本文件以进行更新,在文件结尾处写入
r+brb+打开二进制文件进行更新(读写)
w+bwb+截断为零长度或创建二进制文件以进行更新
a+bab+追加; 打开或创建二进制文件以进行更新,在文件结尾处写入

你可以看到他们区分wwb 。 我不认为需要以不同的方式处理这两者,但是对于二进制数据使用二进制模式通常更安全。

fwrite会返回什么? 通常返回值应该是写入的字节数。 另外,ftell()在fseek之前回答了什么?

它可能有助于了解什么操作系统,C编译器版本和C库。

filepointer是一个cookie。 它没有任何价值。 您可以使用它的唯一方法是在文件中寻找相同的位置。 我甚至不确定ISO C是否保证ftell返回增加的值。 如果您不相信这一点,请查看不同的seek()模式。 它们的存在恰恰是因为位置不是简单的字节偏移。

如果没有刷新和可能的fsync,Windows实际上并没有将所有数据写入文件。 也许这就是原因