# ftell

< c‎ | io

定义于头文件 `<stdio.h>` |  |
long ftell( FILE *stream ); |  |

返回流 `stream` 的文件位置指示器。

若流以二进制模式打开，则由此函数获得的值是从文件开始的字节数。

若流以文本模式打开，则由此函数返回的值未指定，且仅若作为 fseek() 的输入才有意义。

### 参数

stream | - | 要检验的文件流

### 返回值

成功时为文件位置指示器，若失败发生则为 -1L 。

失败时，设 errno 对象为实现定义的正值。

### 示例

ftell带错误检查

    #include <stdio.h>
    #include <stdlib.h>

    int main(void)
    {
        /* 准备浮点值的数组。 */
        #define SIZE 5
        double A[SIZE] = {1.,2.,3.,4.,5.};
        /* 写数组到文件。 */
        FILE * fp = fopen("test.bin", "wb");
        fwrite(A,sizeof(double),SIZE,fp);
        fclose (fp);

        /* 读取浮点值到数组 B。 */
        double B[SIZE];
        fp = fopen("test.bin","rb");
        long int pos = ftell(fp);   /* 位置指示器在文件起始 */
        if (pos == -1L)
        {
           perror("ftell()");
           fprintf(stderr,"ftell() failed in file %s at line # %d\n", __FILE__,__LINE__-4);
           exit(EXIT_FAILURE);
        }
        printf("%ld\n", pos);

        int ret_code = fread(B,sizeof(double),1,fp);   /* 读取一个浮点值 */
        pos = ftell(fp);   /* 读取一个浮点值后的位置指示器 */
        if (pos == -1L)
        {
           perror("ftell()");
           fprintf(stderr,"ftell() failed in file %s at line # %d\n", __FILE__,__LINE__-4);
           exit(EXIT_FAILURE);
        }
        printf("%ld\n", pos);
        printf("%.1f\n", B[0]);   /* 打印浮点值 */

        return EXIT_SUCCESS;
    }

输出：

    0
    8
    1.0

### 引用

- C11 标准（ISO/IEC 9899:2011）：

  - 7.21.9.4 The ftell function (p: 337-338)

- C99 标准（ISO/IEC 9899:1999）：

  - 7.19.9.4 The ftell function (p: 303-304)

- C89/C90 标准（ISO/IEC 9899:1990）：

  - 4.9.9.4 The ftell function

### 参阅

fgetpos | 获取文件位置指示器 (函数)
fseek | 将文件位置指示符移动到文件中的指定位置 (函数)
fsetpos | 将文件位置指示器移动到文件中的指定位置 (函数)