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.
The file does not exist, create it. 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 fileIDopen, 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? stringfileID, where fileID is one of:
open with write access.stdoutstderrread ?-nonewline? fileIDfileID, 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
numBytesnumBytes 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:
openstdinstdoutstderroffset 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 fileIDfileID as a decimal string.flush fileIDfileID.eof fileIDPoints 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