Tcl provides several methods to read from and write to files on
disk. The simplest methods to access a file are via gets
and puts
. When there is a lot of data to be
read, however, it is sometimes more efficient to use the read
command to load an entire file, and
then parse the file into lines with the split
command.
These methods can also be used for communicating over sockets and pipes. It is even possible, via the so-called virtual file system to use files stored in memory rather than on disk. Tcl provides an almost uniform interface to these very different resources, so that in general you do not need to concern yourself with the details.
open
fileName
?access?
?permission?
gets
, puts
, close
, etc.
FileName
is the name of the file to open.access
is the file access mode
r
......Open the file for reading. The file must already exist.r+
...Open the file for reading and writing. The file must already exist.w
.....Open the file for writing. Create the file if it doesn't
exist, or set the length to zero if it does exist.w+
..Open the file for reading and writing. Create the file if it doesn't
exist, or set the length to zero if it does exist.a
......Open the file for writing. The file must already exist.
Set the current location to the end of the file.a+
...Open the file for writing. Create the file if it does not exist.
Set the current location to the end of the file.permission
is an integer to use
to set the file access permissions. The default is
rw-rw-rw-
(0666). You can use it to set the
permissions for the file's owner, the group he/she belongs
to and for all the other users. For many applications, the
default is fine.
close
fileID
open
, and flushes any remaining output.
gets
fileID ?varName?
Reads a line of input from FileID
,
and discards the terminating newline.
If there is a varName
argument,
gets
returns the number of
characters read (or -1 if an EOF occurs), and places the
line of input in varName
.
If varName
is not specified, gets
returns the line of input. An
empty string will be returned if:
puts ?-nonewline?
?fileID? string
fileID
, where
fileID
is one of:
open
with write access.stdout
stderr
read
?-nonewline?
fileID
fileID
, and returns that string. If -nonewline
is set, then the last
character will be discarded if it is a newline. Any existing
end of file condition is cleared before the read
command is executed.
read
fileID numBytes
numBytes
from fileID
, and returns the input as a Tcl
string. Any existing end of file condition is cleared before
the read
command is executed.
seek
fileID
offset
?origin?
fileID
. Note that if the file was
opened with "a" access
that the
current position can not be set before the end of the file for
writing, but can be set to the beginning of the file for
reading.
fileID
is one of:
open
stdin
stdout
stderr
offset
is the offset in bytes at
which the current position is to be set. The position
from which the offset is measured defaults to the start of
the file, but can be from the current location, or the end
by setting origin
appropriately.
origin
is the position to measure
offset
from. It defaults to the
start of the file. Origin
must
be one of:
start
.........Offset
is measured from the start of the file.current
...Offset
is measured from the current position in the file.end
...........Offset
is measured from the end of the file.tell
fileID
fileID
as a decimal string.
flush
fileID
fileID
.
eof
fileID
Points to remember about Tcl file access:
set string [gets filename]
Use the eof
command to
determine if the file is at the end or use the other form of gets
(see the example).
a
(append) access
. You can, however seek to the
beginning of the file for gets
commands.
w+
access
will allow you to overwrite data, but will delete all existing
data in the file.
r+
access
will allow you to overwrite data, while saving the existing
data in the file.
fconfigure
command.
source
command instead of the relatively low-level commands presented
here. Just make sure your data can be interpreted as Tcl
commands and "source" the file.
# # Count the number of lines in a text file # set infile [open "myfile.txt" r] set number 0 # # gets with two arguments returns the length of the line, # -1 if the end of the file is found # while { [gets $infile line] >= 0 } { incr number } close $infile puts "Number of lines: $number" # # Also report it in an external file # set outfile [open "report.out" w] puts $outfile "Number of lines: $number" close $outfile