C File Handling - File
Pointers
C communicates with files using a new datatype called a file pointer.
This type is defined within stdio.h, and written as FILE *.
A file pointer called output_file is declared in a statement like
FILE *output_file;
Opening a file pointer using
fopen
Your program must open a file before it can access it.
This is done using the fopen function, which returns the required file
pointer.
If the file cannot be opened for any reason then the value NULL will be
returned.
You will usually use fopen as follows
if
((output_file = fopen("output_file", "w")) == NULL)
fprintf(stderr, "Cannot open %s\n", "output_file");
fopen takes two arguments, both are strings, the first is the
name of the file to be opened, the second is an access character, which
is
usually one of:
- "r" Open
file for reading
- "w" Open
file for writing
- "a" Open
file for appending
Closing a file using fclose
The fclose command can be used to disconnect a file pointer from a
file.
This is usually done so that the pointer can be used to access a
different file.
Systems have a limit on the number of files which can be open
simultaneously, so it is a good idea to close a file when you have
finished using it. This would be done using a statement like
fclose(output_file);
If files are still open when a program exits, the system will close
them for you.
However it is usually better to close the files properly.
Input and Output using file
pointers
Having opened a file pointer, you will wish to use it for either input
or output.
C supplies a set of functions to allow you to do this. All are very
similar to input and output functions that you have already met.
Character Input and Output
with Files
This is done using equivalents of getchar and putchar which are called
getc and putc. Each takes an extra argument, which identifies the file
pointer to be used for input or output.
putc(c, fp)
getc (fp)
Formatted Input Output with
File Pointers
Similarly there are equivalents to the functions printf and scanf which
read or write data to files.
These are called fprintf and
fscanf.
The functions are used in the same way, except that the fprintf and
fscanf take the file pointer as an additional first argument.
fprintf ( output_file, "This is a listing file\n" ) ;
fscanf ( input_file, "%d", &counter ) ;
Formatted Input Output with
Strings
These are the third set of the printf and scanf families.
They are called sprintf and sscanf.
- sprintf
- puts formatted data into a string which must have sufficient
space allocated to hold it. This can be done by declaring it as an
array of char. The data is formatted according to a control string of
the same form as that for p
rintf.
- sscanf
- takes data from a string and stores it in other variables as
specified by the control string. This is done in the same way that
scanf reads input data into variables. sscanf is very useful for
converting strings into numeric v
values.
Whole Line Input and Output
using File Pointers
Predictably, equivalents to gets and puts exist called fgets and fputs.
The programmer should be careful in using them, since they are
incompatible with gets and puts.
gets requires the programmer to specify the maximum number of
characters to be read.
fgets and fputs retain the trailing newline character on the line they
read or write, wheras gets and puts discard the newline.
When transferring data from files to standard input / output
channels,
the simplest way to avoid incompatibility with the newline is to use
fgets and fputs for files and standard channels too.
For Example, read a line from the keyboard using
fgets(data_string, 80, stdin);
and write a line to the screen using
fputs(data_string, stdout);
EOF is a character which indicates the end of a file.
It is returned by read commands of the getc and scanf families when
they try to read beyond the end of a file.
When you are reading from a file it is useful to be
able to check whether or
not you have reached the end, without just failing to read. The
function
feof can be used to find
out if you have hit the end :
-
if ( feof (input_file ) ) printf ( "BANG!\n" ) ;
This
function returns the value 0 if the end of the file has not been
reached, and
another value if it has. It takes a FILE pointer as a parameter.