#include <stdio.h> long int ftell(FILE *f);
ftell
returns the current position of the stream associated with the
FILE
object addressed by f
, expressed as a long
integer.
The value returned by ftell
can be passed later to a call to the
fseek
function for the same stream to restore the position at the time of
the call to ftell
.
When ftell
is called for a binary stream, the position is expressed as
the number of bytes from the start of the file. ftell
is supported for a
binary stream only when the "rel"
access method is used or for an HFS
file.
When ftell
is called for a text stream, the value returned is an encoded
form of the file position as stored by the fgetpos
function. For a text
stream, the difference between two file positions may not be related to the
amount of separation between the two positions.
See File positioning with fseek and ftell for more information on the implementation of
ftell
. See Tables 3.5 and 3.6 for file types for which ftell
is
not fully implemented.
ftell
returns the current file position expressed as a long int
,
if possible. If ftell
is unable to successfully determine the file
position, or if it cannot be stored in a long int
, -1L
is
returned. In the latter case, an appropriate value is also stored in
errno
. See the list of errno
values in The errno Variable .
ftell
application because the
implementation of ftell
varies from system to system and library to
library.
#include <stdio.h> main() { struct item { char name[40]; int age; }; struct item new_item; struct item *all_items; long start; /* file position pointer */ FILE *f; int i, count=0; f = fopen("tso:ITEMFILE", "rb"); start = ftell(f); /* Set file position pointer. */ /* Count the number of items in the file with age over 20. */ while(!feof(f) && !ferror(f)) { if (fread(&new_item, sizeof(new_item), 1, f)) if (new_item.age > 20) ++count; if (ferror(f)) { puts("Error while reading file..exiting."); exit(1); } } /* Seek to START location. */ if (fseek(f, start, SEEK_SET)) { puts("Could not locate start of file."); exit(1); } /* Allocate space for all items. */ all_items = (struct item*)calloc(count, sizeof(struct item)); if (!all_items) /* Was memory allocated? */ exit(1); /* Read in items and store only the ones with age > 20. */ i = 0; while (!feof(f) && i < count) if (fread((all_items+i), sizeof(struct item), 1, f)) if (all_items[i].age > 20) i++; }
fseek
, fsetpos
, lseek
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.