gpt4 book ai didi

c - 使用 ftell 查找文件大小

转载 作者:行者123 更新时间:2023-12-02 09:13:52 25 4
gpt4 key购买 nike

  fseek(f, 0, SEEK_END); 
size = ftell(f);

如果 ftell(f) 告诉我们当前文件位置,这里的大小应该是文件末尾到开头的偏移量。为什么大小不是 ftell(f)+1? ftell(f) 不应该只给我们文件末尾的位置吗?

最佳答案

文件位置就像文本输入小部件中的光标:它们文件的字节之间。如果我画一张图,这可能最容易理解:

Depiction of a file that is four characters long. There are five boxes in a row; from left to right, they contain the letters "a", "b", "c", and "d", and the fifth one has its area X-ed out.  Below the boxes, aligned with the vertical lines to the left of and in between the boxes, are the numbers 0, 1, 2, 3, and 4.

这是一个假设文件。它包含四个字符:abcd。每个字符都有一个自己的小盒子,我们称之为“字节”。 (此文件是 ASCII。)第五个框已被划掉,因为它还不是文件的一部分,但如果您将第五个字符附加到文件,它就会出现。

此文件中的有效文件位置是 0、1、2、3 和 4。其中有五个,而不是四个;它们对应于框之前、之后和之间的垂直线。当您打开文件时(假设您不使用 "a" ),您从位置 0 开始,即文件中第一个字节之前的行。当您查找到末尾时,您会到达位置 4,即文件中最后一个字节之后的行。因为我们从零开始计数,所以这也是文件中的字节数。 (这是为什么我们从零而不是从一开始计数的几个原因之一。)

我不得不警告你,有几个原因

fseek(fp, 0, SEEK_END);
long int nbytes = ftell(fp);

可能不会给你你真正想要的数字,这取决于你所说的“文件大小”和文件内容。排名不分先后:

  • 在 Windows 上,如果您以文本模式打开文件,您从 ftell 获得的数字在该文件上,不是 从文件开头开始的字节偏移量;他们更像是fgetpos cookies,只能用于后续调用 fseek .如果你需要在 Windows 上的文本文件中四处寻找,你最好以二进制模式打开文件并自己处理 DOS 和 Unix 行尾——这实际上是我对一般生产代码的建议,因为它完全有可能在 Unix 系统上有一个以 DOS 行结尾的文件,反之亦然。

  • 在系统上 long int是 32 位,文件很容易比它大,在这种情况下 ftell将失败,返回 −1 并设置 errnoEOVERFLOW . POSIX.1-2001 兼容系统提供了一个名为 ftello 的函数返回 off_t可以表示较大文件大小的数量,前提是您输入 #define _FILE_OFFSET_BITS 64在所有源文件的最顶部(在任何 #include 之前)。我不知道 Windows 的等效项是什么。

  • 如果您的文件包含 ASCII 以外的字符,那么文件中的字节数很可能与文件中的字符数不同文件。 (例如,如果文件以 UTF-8 编码,字符 咖啡 将占用三个字节,Ä 将占用两个或三个字节,具体取决于它是“组合”,జ్ఞా 将占用 12 个字节,因为尽管是单个 grapheme ,但它是一个包含四个 Unicode 代码点的字符串。) ftell(o)仍会告诉您传递给 malloc 的正确号码,如果你的目标是将整个文件读入内存,但遍历“字符”将不会像 for (i = 0; i < len; i++) 这样简单.

  • 如果您正在使用 C 的“宽流”和“宽字符”,那么,就像 Windows 上的文本流一样,您从 ftell 获得的数字该文件上的字节偏移量不是字节偏移量,除了随后调用 fseek 外,可能对任何其他用途都没有用。 .但是宽流和字符无论如何都是一个糟糕的设计;如果您坚持在狭窄的流和字符中手动处理 UTF-8,您实际上更有可能正确处理世界上所有的语言。

关于c - 使用 ftell 查找文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49121638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com