ZetCode

Tcl close Command

last modified October 20, 2026

The Tcl close command is used to close file handles and channels. It's essential for proper resource management in file operations. The command ensures system resources are freed after file operations.

Basic Definition

The close command terminates the association between a file handle and the actual file. It flushes any pending output and releases system resources.

Syntax: close channelId ?r(ead)|w(rite)?. The command takes a channel identifier as a required argument; the optional second argument closes only one direction of a bidirectional channel such as a socket or a pipeline. It returns an empty string on success or raises an error on failure.

Closing a File After Writing

This example shows basic file writing operation with proper closing.

basic_close.tcl
set fileId [open "output.txt" w]
puts $fileId "Hello, Tcl!"
close $fileId

We first open a file for writing, write a string to it, then close it. The close ensures all data is written and resources are freed.

Closing a File After Reading

This demonstrates proper file handling when reading from a file.

close_after_read.tcl
set fileId [open "input.txt" r]
set content [read $fileId]
close $fileId
puts $content

Here we open a file, read its contents, then immediately close it. Closing files promptly after use is a good practice to prevent resource leaks.

Error Handling with Close

The close command can raise errors which should be handled.

close_error.tcl
if {[catch {open "nonexistent.txt" r} fileId]} {
    puts "Error opening file: $fileId"
} else {
    set content [read $fileId]
    if {[catch {close $fileId} err]} {
        puts "Error closing file: $err"
    }
}

This shows error handling for both open and close operations. The catch command helps manage potential errors gracefully. The file does not exist, so open fails and the first message is printed. close itself rarely fails for plain files, but it raises an error when buffered data cannot be written (for example when the disk is full) and for a command pipeline whose process exits with a non-zero status or writes to standard error.

Closing Standard Channels

Tcl's standard channels (stdin, stdout, stderr) can also be closed.

close_std.tcl
puts "Before closing stdout"
close stdout
if {[catch {puts "This won't appear"} err]} {
    puts stderr "Error: $err"
}

This demonstrates closing the standard output channel. After closing stdout, attempts to write to it fail with an error, which the script catches and prints to stderr. This is generally not recommended.

Closing Socket Connections

The close command works with socket connections too.

close_socket.tcl
set sock [socket localhost 8080]
puts $sock "GET / HTTP/1.0\r\n\r\n"
flush $sock
set response [read $sock]
close $sock
puts "Received [string length $response] bytes"

This shows a basic HTTP request where we properly close the socket after use. Closing network connections is as important as closing files.

Closing Multiple Handles

Multiple file handles can be managed and closed in sequence.

close_multiple.tcl
set file1 [open "file1.txt" w]
set file2 [open "file2.txt" w]
puts $file1 "Data for file1"
puts $file2 "Data for file2"
close $file1
close $file2

This example demonstrates managing multiple file handles. Each handle should be closed individually when no longer needed to free system resources.

Best Practices

This tutorial covered the Tcl close 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.