代码之家  ›  专栏  ›  技术社区  ›  Daniel

文件尾*指针不等于写入数据的大小

  •  8
  • Daniel  · 技术社区  · 16 年前

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

    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 回复  |  直到 14 年前
        1
  •  19
  •   paxdiablo    14 年前

    因为您是在文本模式下打开文件,所以它会将行尾标记(如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+b rb+ 打开二进制文件进行更新(读写)
    w+b wb+ 截断为零长度或创建二进制文件进行更新
    a+b ab+ 附加;打开或创建二进制文件进行更新,在文件末尾写入

    你可以看到他们区分 W 世界银行 . 我不相信实现是 必修的 以不同的方式处理这两个问题,但对二进制数据使用二进制模式通常更安全。

        2
  •  0
  •   DarenW    16 年前

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

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

        3
  •  0
  •   MSalters    16 年前

    文件指针是一个cookie。它没有价值。你唯一能用它做的就是在一个文件中寻找同一个地方。我甚至不确定iso c是否保证ftell返回递增的值。如果您不相信这一点,请查看不同的seek()模式。它们的存在正是因为位置不是一个简单的字节偏移量。

        4
  •  0
  •   rogerdpack    14 年前

    如果没有刷新(可能是fsync),Windows实际上不会将所有数据写到文件中。也许这就是为什么