
#include <lcio.h> int afread0(void *ptr, size_t size, size_t count, FILE *f);
afread0 reads items from the stream associated with the
FILE object addressed by f until a record break is
encountered. size defines the size of each item, count
defines the maximum number of items to be read, and ptr
addresses the area into which the items will be read. If the current
record contains more than count items, a diagnostic message is
generated and the file's error flag is set. A zero-length record is
considered to be a valid record containing 0 items.
Calls to afread0 to obtain items of type typeval
commonly have the form
typeval buf[count]; numread = afread0(buf, sizeof(typeval), count, f);
afread0 is supported only for binary streams. You can use the
fgets function to read a record from a text stream. See
Augmented Standard I/O for more information on afread0.
Note:
afread0 differs from afread only in the type
of the return value and the treatment of zero-length records.
afread0 returns the number of items read from the record (which
may be less than the maximum or zero). If an error or end-of-file
occurs, a negative value is returned.
afread0 behaves
exactly like fread because these files are processed as
continuous streams of characters without record boundaries. To process
a file with relative attributes on a record-by-record basis, you must
open it with afopen and specify the "seq" access method.
afread0 never reads past the end of the current record; an
error occurs if the record contains a fractional number of items or if
it contains more data after count items.
The return value from afread0 does not distinguish between end
of file and an error condition. Use the ferror function
to make this distinction.
#include <lcio.h>
#include <stdlib.h>
char *_style = "tso"; /* Assume tso-style file names. */
main(int argc, char *argv[]) {
FILE *in, *out;
char *buf; /* will be allocated to hold one record */
int recsize;
int count;
int rc;
if (argc < 3) {
puts("Two arguments are required.");
exit(EXIT_FAILURE);
}
if (argc > 3)
puts("Extraneous command line arguments ignored.");
in = fopen(argv[1], "rb");
out = fopen(argv[2], "wb");
if (!in || !out) {
puts("File(s) failed to open.");
exit(EXIT_FAILURE);
}
/* Get input file record size. */
recsize = fattr(in)->reclen;
/* Guess if record size unknown. */
if (recsize == 0) recsize = 65536;
/* Allocate a buffer area. */
buf = malloc(recsize);
if (buf == NULL) exit(EXIT_FAILURE);
for(;;) {
/* Read a record. */
count = afread0(buf, 1, recsize, in);
/* EOF or input error */
if (count < 0 || ferror(in)) break;
/* Write the record. */
count = afwrite0(buf, 1, count, out);
/* output error */
if (count < 0 || ferror(out)) break;
}
if (ferror(in) || ferror(out)) rc = EXIT_FAILURE;
else rc = EXIT_SUCCESS;
if (rc == EXIT_SUCCESS)
puts("Copy was successful.");
else puts("Copy failed (see library messages).");
fclose(in);
fclose(out);
exit(rc);
}
afread
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.