%>
获取文件指针的当前位置。
语法
long ftell(
FILE *stream
);
__int64 _ftelli64(
FILE *stream
);
参数
stream
目标 FILE
结构。
返回值
ftell
和 _ftelli64
返回当前的文件位置。 ftell
和 _ftelli64
返回的值可能无法反映以文本模式打开的流的物理字节偏移量,因为文本模式会导致回车换行转换。 使用带有 fseek
的 ftell
或带有 _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 并在可能的情况下将其移除。 这是因为将 ftell
和 fseek
或者将 _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