| #-----------------------------
set filename {/tmp/messages}
if {![catch {open $filename r} F]} {
    while {[gets $F line] >= 0} {
        if [regexp  -- {blue} $line] {
            puts $line
        }
    }
close $F
} else {
error "Opening $filename: $F"
}
#-----------------------------
while {[gets stdin line] >= 0} {        #read from STDIN
    if {![regexp -- {\d} $line]} {
        puts stderr {No digit found}    #writes to STDERR
    }
    puts "Read: $line"                  #writes to STDOUT
}
#-----------------------------
set logfile [open {/tmp/log} w]
close $logfile
#-----------------------------
puts $logfile {Countdown initiated}
puts {You have 30 seconds to reach minimum safety distance.} | 
| #----------------------------- # open file "path" for reading only set source [open $path r] # open file "path" for writing only set sink [open $path w] # open file "path" for reading only set source [open $path RDONLY] # open file "path" for writing only set sink [open $path WRONLY] # open "path" for reading and writing set file [open $path r+ ] # open "path" with the flags "flags" (see examples below for flags) set file [open $path $flags] # open file "path" read only set file [open $path r] set file [open $path RDONLY] # open file "path" write only, create it if it does not exist # truncate it to zero length if it exists set file [open $path w] set file [open $path {WRONLY TRUNC CREAT}] # open file "path" write only, fails if file exists set file [open $path {WRONLY EXCL CREAT}] # open file "path" for appending set file [open $path a] set file [open $path {WRONLY APPEND CREAT}] # open file "path" for appending only when file exists set file [open $path {WRONLY APPEND}] # open file "path" for reading and writing set file [open $path r+] set file [open $path w+] set file [open $path RDWR] # open file for reading and writing, create a new file if it does not exist set file [open $path {RDWR CREAT}] # open file "path" reading and writing, fails if file exists set file [open $path {RDWR EXCL CREAT}] | 
| #----------------------------- # tcl open does not use chars with special meaning. set file [open $filename] | 
| #-----------------------------
set el [file split $path]
lset el 0 [glob [lindex $el 0]]
set expandedpath [file join {expand}$el] | 
| #----------------------------- # the raised exception contains the filename. open afile r | 
| #-----------------------------
set data {
Your data goes here
}
foreach line [split $data "\n"] {
    # process the line
}#-----------------------------
while {[gets stdin line] >= 0} {
    # do something with the line.
}
#-----------------------------
foreach filename $argv {
    # closing and exception handling are done by the block
    if {![catch {open $filename r} F]} {
        set line [gets $F] #do stuff with $line
        close $F
    } else {
        error "can't open $filename"
    }
}
#-----------------------------
if {![llength $argv]} {
    set argv [glob {*.[Cch]}]
}
#-----------------------------
# arg demo 1
set chop_first 0
if {![string compare [lindex $argv 0] {-c}]} {
    incr chop_first
    set argv [lrange $argv 1 end]
}
#-----------------------------
# arg demo 2
if [regexp -- {^-(\d+)$} [lindex $argv 0] all one] {
    set columns $one
    set argv [lrange $argv 1 end]
}
#-----------------------------
# arg demo 3 - clustered options
# unfortunately tcllib does not yet provide clustered opts
# so using the same logic as that of perl.
set append 0
set ignore_ints 0
set nostdout 0
set unbuffer 0
foreach arg $argv {
    #process arg for -abcd
    set parg $arg
    while 1 {
        if [regexp -- {^-(.)(.*)$} $parg all one two] {
            switch -- $one {
                {a} {incr append}
                {i} {incr ignore_ints}
                {n} {incr ignore_ints}
                {u} {incr unbuffer}
                default { error {usage: [-ainu] [filenames] ...}}
            }
            set parg -$two
        } else {
            break
        }
    }
}
#-----------------------------
set fd [open [lindex $argv 0]]
set data [read -nonewline $fd]
close $fd
#-----------------------------
foreach arg $argv {
    set F [open $arg r]
    for {set i 0} {[gets $F line] >= 0} {incr i} {
        puts $arg:$i:$line
    }
    close $F
}
#-----------------------------
foreach arg $argv {
    set F [open $arg r]
    while {[gets $F line] >= 0} {
        if [regexp -- {login} $line] {
            puts $line
        }
    }
    close $F
}
#-----------------------------
set fd [open [lindex $argv 0] r]
set data [read -nonewline $fd]
close $fd
set chunks 0
foreach line [split $data "\n"] {
    switch $line {
    {^#} continue
    {__(DATA|END)__} break
    default { set chunks [llength $line]}
}
puts "Found $chunks chunks" | 
| #-----------------------------
set old [open $old_file]
set new [open $new_file w]
while {[gets $old line] >= 0} {
    # change $line, then...
    puts $new $line
}
close $old
close $new
file rename $old_file "old.orig"
file rename $new_file $old_file
for {set i 0} {[gets $old line] >= 0} {incr i} {
    if {$i == 20} { # we are at the 20th line
        puts $new "Extra line 1"
        puts $new "Extra line 2"
    }
    puts $new $line
}
for {set i 0} {[gets $old line] >= 0} {incr i} {
    if {![expr (20 <= $i) && ($i <= 30)]} {
        puts $new $line
    }
} | 
| #-----------------------------
set fd [open {itest} r+]
set data [read -nonewline $fd]
regsub {foo} $data {QQQ} data
chan seek $fd 0
puts $fd $data
chan truncate $fd
close $fd
#-----------------------------
set fd [open {itest} r+]
set data [read -nonewline $fd]
regsub {foo} $data [clock format [clock seconds]] data
chan seek $fd 0
puts $fd $data
chan truncate $fd
close $fd | 
| #----------------------------- # tcl does not yet support locking of files though it is available in tclx # @@INCOMPLETE@@ # @@INCOMPLETE@@ | 
| #-----------------------------
chan configure $fd none
if [llength $argv] {
    chan configure stdout none
}
puts -nonewline {Now you dont see it...}
sleep 2
puts {Now you do}
#-----------------------------
# stderr is unbuffered by default. so this is not necessary
chan configure stderr none
chan configure $fd full
#-----------------------------
chan configure $sock none
chan configure $fd full
#-----------------------------
set sock [socket {www.tcl.tk} 80]
chan configure $sock -buffering none
puts $sock "GET / HTTP/1.0\n\n"
set resp [read -nonewline $sock]
close $sock
puts "DOC is \n$resp\n" | 
| #-----------------------------
# assume fh1 fh2 fh3 are open channels
foreach $f {fh1 fh2 fh3} {
    chan event [set $f] readable {
        # do something when this becomes readable.
    }
    chan event [set $f] writable {
        # do something when this becomes writable.
    }
}
vwait forever | 
| #-----------------------------
set fd [open {/dev/cua0} r+]
chan configure $fd -blocking 0
#-----------------------------
set blocked [chan configure $fd -blocking]
chan configure $fd -blocking 0
#-----------------------------
chan configure $fd -blocking 0
chan puts $fd {some data}
if [chan blocked $fd] {
    # incomplete write, but there is no case of
    # us having to redo the write again since tcl
    # does it in the back ground for us.
}
set buffer [chan read -nonewline $fd $bufsize]
if [chan blocked $fd] {
    # did not read full bufsize.
} | 
| #----------------------------- # @@INCOMPLETE@@ # @@INCOMPLETE@@ | 
| #-----------------------------
# tcl filehandles are like any other vars
set fd [open {myfile}]
set newfd $fd
set data [myproc $newfd] | 
| #----------------------------- # @@INCOMPLETE@@ # @@INCOMPLETE@@ | 
| #-----------------------------
foreach $f {fh1 fh2 fh3} {
    puts [set $f] $stuff_to_print
}
#-----------------------------
set fd [open {| tee file1 file2 > /dev/null} w]
puts $fd {data\n}
close $fd | 
| #----------------------------- # @@INCOMPLETE@@ # @@INCOMPLETE@@ | 
| #-----------------------------
# file descriptors are just like any other variables
set fd [open {file}]
set newfd $fd |