### 4.28 `ftell`, `ftello`—return position in a stream or file

Synopsis

    #include <stdio.h>
    long ftell(FILE *fp);
    off_t ftello(FILE *fp);
    long _ftell_r(struct _reent *ptr, FILE *fp);
    off_t _ftello_r(struct _reent *ptr, FILE *fp);

Description
Objects of type `FILE` can have a “position” that records how much of the file your program has already read. Many of the `stdio` functions depend on this position, and many change it as a side effect.

The result of `ftell`/`ftello` is the current position for a file identified by fp. If you record this result, you can later use it with `fseek`/`fseeko` to return the file to this position. The difference between `ftell` and `ftello` is that `ftell` returns `long` and `ftello` returns `off_t`.

In the current implementation, `ftell`/`ftello` simply uses a character count to represent the file position; this is the same number that would be recorded by `fgetpos`.

Returns
`ftell`/`ftello` return the file position, if possible. If they cannot do this, they return `-1L`. Failure occurs on streams that do not support positioning; the global `errno` indicates this condition with the value `ESPIPE`.

Portability
`ftell` is required by the ANSI C standard, but the meaning of its result (when successful) is not specified beyond requiring that it be acceptable as an argument to `fseek`. In particular, other conforming C implementations may return a different result from `ftell` than what `fgetpos` records.

`ftello` is defined by the Single Unix specification.

No supporting OS subroutines are required.