对于给定的文件指针(FILE *
),可以快速确定从当前位置到文件末尾的距离。
确定实际距离所花费的时间不应该取决于距离。
例如,fpos_t
的减法,但fpos_t不是整数,因此无法进行数值运算。还有其他方法吗?
不,你不能。FILE结构不知道文件有多长,因此没有找到此距离的简便方法。该文件被视为一条道路-您变成道路,然后沿着道路行驶,当道路结束时,您会发现。但是没有迹象表明这条路有多长。
您可以使用stat
或类似名称分别询问操作系统。但是请注意,FILE甚至并不总是引用具有定义结尾的文件-它可能是stdin
来自管道,并且大小当时完全未知。
当您首次打开文件时,可以使用fseek()
转到文件的末尾(但请参见下面的注释),然后使用fseek()
获取位置并将其保存(作为文件的大小)。然后调用ftell()
返回到开头。
然后,可以从保存的'大小'中减去以后调用rewind()
的返回值,以获取从当前位置到文件末尾的偏移量(距离):
ftell()
但是请注意,从上方链接到ftell()
的cppreference页面上,实现// Given a FILE* fp that;s just been opened:
fseek(fp, SEEK_END, 0);
long int endptr = ftell(fp);
rewind(fp); // Or you can use fseek(fp, SEEK_SET, 0);
//...
// Later in your code:
long int dtoend = endptr - ftell(pf);
的实现是不是必需的]:
- 不允许库实现有意义地支持SEEK_END(因此,使用库实现的代码没有真正的标准可移植性。
您可以使用SEEK_END
获取文件的当前位置,使用fseek
查找末尾,然后再次使用ftell()
获取文件末尾的偏移量(或大小)。