File Access 101

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?
Opens a file and returns a token to be used when accessing the file via gets, puts, close, etc.
close fileID
Closes a file previously opened with 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
Writes the characters in string to the stream referenced by fileID, where fileID is one of:
read ?-nonewline? fileID
Reads all the remaining bytes from 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
Reads up to 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?
Change the current position within the file referenced by 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.
tell fileID
Returns the position of the access pointer in fileID as a decimal string.
flush fileID
Flushes any output that has been buffered for fileID.
eof fileID
returns 1 if an End Of File condition exists, otherwise returns 0.

Points to remember about Tcl file access:


# 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