
#include <stdio.h> int fsetpos(FILE *f, const fpos_t pos);
fsetpos positions the stream associated with the FILE object
addressed by f to the position specified by the object pointed to by
pos. This object is of type fpos_t, which is defined in
stdio.h.
The value of the object addressed by pos may have been stored by a
previous call to fgetpos for the same stream, or it may have been
constructed by some other mechanism. The use of values that have not been
generated by fgetpos is nonportable. See File positioning with fgetpos and fsetpos
for information on the interpretation of file-position values.
The fsetpos function can be used with most files, accessed either as
text or binary. Note that it may be used to reposition files that fseek
cannot process, including files accessed as a binary stream using the
"seq" access method. See Tables 3.5 and 3.6 for file types that do not
fully support fsetpos.
After a call to fsetpos on a stream that permits both reading and
writing, the next file operation may be input or output.
fsetpos returns 0. If it fails, fsetpos returns a
nonzero value and stores an appropriate error code in errno. See the list
of errno values in The errno Variable . Calls to fsetpos with an
invalid pos may not be detected immediately, but such calls will probably
cause errors whenever the file is next read or written.
fsetpos, characters following the point
of output may be erased from the file. This occurs when trunc=yes is in
effect. Therefore, when trunc=yes is in effect, you are unable to return
to a previous file position if output has been performed before that point.
See Opening Files for more information on the trunc amparm.
A program that makes direct use of the components of an fpos_t value
is not portable.
fgetpos and the structure of fpos_t values.
fsetpos and fgetpos to build
and use an index file for access to individual lines of a file:
#include <stdio.h>
#include <string.h>
#define KEYLEN 10 /* size of key in record */
#define DATALEN 70 /* size of data area in record */
#define TABSIZE 100 /* maximum number of records */
struct {
char keyval[KEYLEN];
fpos_t location;
} keytable[TABSIZE];
struct record {
char keyval[KEYLEN];
char data[DATALEN];
};
int filesize;
void bldtable(FILE *fileptr);
int findrec(FILE *fileptr, char keyval[KEYLEN], struct record *input);
main()
{
FILE *fileptr;
struct record output;
char key[KEYLEN] = "PAR-94412M"; /* key to be found */
/* Open data file and build index file. */
/* Example of information in data file: */
/* PAR-97612MPearl & Black $325.00 */
/* PAR-94412MMarbled Green $275.00 */
if ((fileptr = fopen("ddn:DATA", "rb")) != NULL)
bldtable(fileptr);
else{
puts("Unable to open input file.");
exit(99);
}
/* Find desired key. */
if ( !findrec(fileptr, key, &output) )
printf("Data area associated with key %.*s is: %.*sn",
KEYLEN, key, DATALEN, output.data);
else
puts("Unable to find matching key.");
}
/* Build the table for key and record addresses. */
void bldtable(FILE *fileptr)
{
struct record input;
int index = 0;
for (;;){
/* Store file pointer location. */
fgetpos(fileptr, &keytable[index].location);
/* Read one record. */
fread(&input, sizeof(struct record), 1, fileptr);
if (feof(fileptr) || ferror(fileptr))
break;
/* Save the keyval. */
memcpy(keytable[index].keyval, input.keyval, KEYLEN);
++index;
}
filesize = index;
return;
}
/* Find the key. */
int findrec(FILE *fileptr, char keyval[KEYLEN],
struct record *input)
{
int index;
/* Search keytable for specified keyval. */
for(index = 0; index < filesize; ++index)
if (memcmp(keyval, keytable[index].keyval,KEYLEN) == 0)
break;
/* Was the key found? */
if (index >= filesize)
return -1;
/* If found, read complete record from file. */
fsetpos(fileptr, &keytable[index].location);
fread(input, sizeof(struct record), 1, fileptr);
return 0;
fgetpos, fseek, lseek
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.