File I/O
File I/O is fairly traditional - you open an input or output stream, specifying the
name of the file, and then read from or write to the stream (closing the stream when
you're done with the file).
There are two approaches, a simplified approach using tell and see, or a more hands-on approach using open, close, read, write
tell and see
tell('filename') specifies that all subsequent output is to be directed to that file.
telling(F) identifies which file we are currently writing to (user if stdout)
told. closes the filestream
Similarly, see('filename'), seeing(F), and seen identify which file to use as the source for input.
open and close
When opening files you specify the access mode (e.g. read, write, append).
EXAMPLES:
% readfile(Filename, Term)
% allows us to read a term from a file,
% if the filename passed to us is uninstantiated then we will first
% prompt the user for a filename
% Term will be set to the atom end_of_file
% if the end of file is read
% read a term from a file, where the user has not yet specified the filename
readfile(Filename,Term) :- var(Filename), % if they didn't give a filename
% prompt them to enter one IN SINGLE QUOTES
write('enter a filename in single quotes '), nl,
read(Filename), % read the filename
readfile(Filename, Term). % call the other readfile rule.
% read a term from a specified file
readfile(Filename,Term) :- nonvar(Filename), % if they already specified a filename
exists_file(Filename), % make sure the file exists
access_file(Filename, read), % make sure we have read permission
open(Filename, read, Stream), % open the file for reading
read(Stream, Term), % read the first term
close(Stream), % close the file
write('The first term in '), % give an output message
write(Filename),
write(' is:'), nl,
write(Term), nl. % echo the contents
% if neither of the above methods worked, then display an error message
readfile :- write('Unable to perform the requested read'), nl.
% writetest allows us to write a term to a file,
% if the filename passed to us is uninstantiated then we will first
% prompt the user for a filename
% write some content to a file, where the user has not yet supplied the filename
writefile(Filename, Content) :- var(Filename), % if they didn't give a filename
% prompt them to enter one IN SINGLE QUOTES
write('enter a filename in single quotes '), nl,
read(Filename), % read the filename
writefile(Filename, Content). % call the other readtest rule.
writefile(Filename, Content) :- nonvar(Filename), % if a filename was supplied
open(Filename, write, Stream), % open the file
write(Stream, Content), % write the content
nl(Stream), % write a newline
close(Stream). % close the file
% if neither of the above methods worked, then display an error message
writefile :- write('Unable to perform the requested write'), nl.
File system interaction
There is a substantial collection of methods to interact with the filesystem: