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

时间:2008-09-28 02:20:34

标签: c fopen fwrite ftell

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

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.

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

4 个答案:

答案 0 :(得分:19)

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

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

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

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

C99标准在7.19.5.3 The fopen function

中有这个说法
  

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

     

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

您可以看到他们区分wwb。我不认为实现 required 以不同的方式处理这两种情况,但通常使用二进制模式来处理二进制数据会更安全。

答案 1 :(得分:0)

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

了解操作系统,C编译器版本和C库可能会有所帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

windows实际上没有将所有数据写入文件而没有刷新和可能的fsync。也许这就是为什么