On the GNU system, the file position is truly a character count. You
can specify any character count value as an argument to fseek or
fseeko and get reliable results for any random access file.
However, some ISO C systems do not represent file positions in this
way.
On some systems where text streams truly differ from binary streams, it is impossible to represent the file position of a text stream as a count of characters from the beginning of the file. For example, the file position on some systems must encode both a record offset within the file, and a character offset within the record.
As a consequence, if you want your programs to be portable to these systems, you must observe certain rules:
ftell on a text stream has no predictable
relationship to the number of characters you have read so far. The only
thing you can rely on is that you can use it subsequently as the
offset argument to fseek or fseeko to move back to
the same file position.
fseek or fseeko on a text stream, either the
offset must be zero, or whence must be SEEK_SET and
and the offset must be the result of an earlier call to ftell
on the same stream.
ungetc
that haven't been read or discarded. See section Unreading.
But even if you observe these rules, you may still have trouble for long
files, because ftell and fseek use a long int value
to represent the file position. This type may not have room to encode
all the file positions in a large file. Using the ftello and
fseeko functions might help here since the off_t type is
expected to be able to hold all file position values but this still does
not help to handle additional information which must be associated with
a file position.
So if you do want to support systems with peculiar encodings for the
file positions, it is better to use the functions fgetpos and
fsetpos instead. These functions represent the file position
using the data type fpos_t, whose internal representation varies
from system to system.
These symbols are declared in the header file `stdio.h'.
fgetpos and
fsetpos.
In the GNU system, fpos_t is equivalent to off_t or
long int. In other systems, it might have a different internal
representation.
When compiling with _FILE_OFFSET_BITS == 64 on a 32 bit machine
this type is in fact equivalent to off64_t since the LFS
interface transparently replaced the old interface.
fgetpos64 and
fsetpos64.
In the GNU system, fpos64_t is equivalent to off64_t or
long long int. In other systems, it might have a different internal
representation.
fpos_t object pointed to by
position. If successful, fgetpos returns zero; otherwise
it returns a nonzero value and stores an implementation-defined positive
value in errno.
When the sources are compiled with _FILE_OFFSET_BITS == 64 on a
32 bit system the function is in fact fgetpos64. I.e., the LFS
interface transparently replaced the old interface.
fgetpos but the file position is
returned in a variable of type fpos64_t to which position
points.
If the sources are compiled with _FILE_OFFSET_BITS == 64 on a 32
bits machine this function is available under the name fgetpos
and so transparently replaces the old interface.
fgetpos on the same stream. If successful, fsetpos
clears the end-of-file indicator on the stream, discards any characters
that were "pushed back" by the use of ungetc, and returns a value
of zero. Otherwise, fsetpos returns a nonzero value and stores
an implementation-defined positive value in errno.
When the sources are compiled with _FILE_OFFSET_BITS == 64 on a
32 bit system the function is in fact fsetpos64. I.e., the LFS
interface transparently replaced the old interface.
fsetpos but the file position used
for positioning is provided in a variable of type fpos64_t to
which position points.
If the sources are compiled with _FILE_OFFSET_BITS == 64 on a 32
bits machine this function is available under the name fsetpos
and so transparently replaces the old interface.
Go to the first, previous, next, last section, table of contents.