ftell_ftelli64

获取文件指针的当前位置。

语法

long ftell(
   FILE *stream
);
__int64 _ftelli64(
   FILE *stream
);

参数

stream
目标 FILE 结构。

返回值

ftell_ftelli64 返回当前的文件位置。 ftell_ftelli64 返回的值可能无法反映以文本模式打开的流的物理字节偏移量,因为文本模式会导致回车换行转换。 使用带有 fseekftell 或带有 _fseeki64_ftelli64 正确地返回到文件位置。 出现错误时,ftell_ftelli64 会调用无效的参数处理程序,如参数验证中所述。 如果允许执行继续,则这些函数将返回 -1L 并将 errno 设置为 ERRNO.H 中定义的两个常量之一。 EBADF 常量意味着stream 参数不是有效的文件指针值,或者未引用打开的文件。 EINVAL 意味着传递给函数的 stream 参数无效。 在无法查找的设备(例如终端和打印机)上,或者当 stream 未引用打开的文件时,返回值是未定义的。

有关返回代码的详细信息,请参阅 errno_doserrno_sys_errlist_sys_nerr

注解

ftell_ftelli64 函数检索与 stream 关联的文件指针(如果有)的当前位置。 位置表示为相对于流开头的偏移量。

当文件打开以追加数据时,当前文件位置由最后的 I/O 操作确定,而不是由发生下一个写入的位置确定。 例如,假设打开一个文件进行追加,最后一个操作是读操作。 文件位置是下一个读操作开始的点,而不是下一个写操作开始的位置。 (打开文件进行追加时,文件位置将在执行任何写入操作之前移至文件末尾)。如果在打开进行追加的文件上尚未执行 I/O 操作,则文件位置为文件开头。

在文本模式中,CTRL+Z 将在输入时解释为文件尾字符。 在打开以进行读取/写入的文件中,fopen 和所有相关例程将检查文件末尾的 Ctrl+Z 并在可能的情况下将其移除。 这是因为将 ftellfseek 或者将 _ftelli64_fseeki64 结合使用在以 CTRL+Z 结尾的文件中移动,可能导致 ftell_ftelli64 在文件结尾附近无法正常工作。

此函数在执行期间会锁定调用线程,因此是线程安全的。 有关非锁定版本,请参阅 _ftell_nolock

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态

要求

函数 必需的标头 可选标头
ftell <stdio.h> <errno.h>
_ftelli64 <stdio.h> <errno.h>

有关兼容性的详细信息,请参阅 兼容性

示例

// crt_ftell.c
// This program opens a file named CRT_FTELL.C
// for reading and tries to read 100 characters. It
// then uses ftell to determine the position of the
// file pointer and displays this position.

#include <stdio.h>

FILE *stream;

int main( void )
{
   long position;
   char list[100];
   if( fopen_s( &stream, "crt_ftell.c", "rb" ) == 0 )
   {
      // Move the pointer by reading data:
      fread( list, sizeof( char ), 100, stream );
      // Get position after read:
      position = ftell( stream );
      printf( "Position after trying to read 100 bytes: %ld\n",
              position );
      fclose( stream );
   }
}
Position after trying to read 100 bytes: 100

另请参阅

流 I/O
fopen_wfopen
fgetpos
fseek_fseeki64
_lseek_lseeki64