ZetCode

Tcl read Command

last modified April 3, 2025

The Tcl read command reads data from files or channels. It's essential for file input operations in Tcl. The command can read entire files or specific amounts of data.

Basic Definition

The read command reads data from a file channel. It returns the data as a string. The command can read until end-of-file or a specified number of characters.

Syntax: read channelId ?numChars?. With one argument, it reads until EOF. With two arguments, it reads up to numChars bytes.

Reading Entire File

This example shows how to read an entire file into a variable at once.

read_entire.tcl
set file [open "data.txt" r]
set content [read $file]
close $file
puts $content

First, we open the file in read mode. Then read loads all content into memory. Finally, we close the file and print the content.

Reading Specific Number of Characters

The read command can read a limited number of characters.

read_chars.tcl
set file [open "data.txt" r]
set first10 [read $file 10]
close $file
puts "First 10 chars: $first10"

This reads exactly 10 characters from the file. If the file is shorter, it returns all available characters. The file position advances by 10.

Reading Line by Line

While gets is better for line reading, read can be combined with split for similar functionality.

read_lines.tcl
set file [open "data.txt" r]
set content [read $file]
close $file

set lines [split $content "\n"]
foreach line $lines {
    puts "Line: $line"
}

This reads the entire file then splits it into lines. Each line is then processed individually. Note this loads the whole file into memory.

Binary File Reading

read can handle binary files by using the binary encoding.

read_binary.tcl
set file [open "image.png" rb]
set header [read $file 8]
close $file

binary scan $header H* hex
puts "PNG header: $hex"

This reads the first 8 bytes of a PNG file. The rb mode opens the file in binary mode. We then convert the bytes to hexadecimal.

Reading with Progress

For large files, you might want to read in chunks with progress updates.

read_progress.tcl
set file [open "largefile.dat" r]
fconfigure $file -buffersize 4096

while {![eof $file]} {
    set chunk [read $file 4096]
    puts -nonewline "."
    update
}

close $file
puts "\nDone reading file"

This reads a file in 4KB chunks, printing progress dots. The update command ensures the UI updates. Buffersize is set for efficiency.

Reading from Standard Input

The read command can also read from standard input.

read_stdin.tcl
puts "Enter some text (Ctrl+D to end):"
set input [read stdin]
puts "You entered: $input"

This reads all input from stdin until EOF (Ctrl+D). The entire input is stored in the input variable. Useful for piped input.

Best Practices

This tutorial covered the Tcl read command with practical examples showing its usage in different scenarios.

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all Tcl Tutorials.