:TITLE: File Access 101
;#
;# RCSID: $Header: /cvsroot/tcl/tcltutorial/original/Tcl24.lsn,v 1.1 2004/11/04 16:01:14 davidw Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI 48130
;# clif@cflynt.com
;# See file "NOTICE" for licensing terms.
;#
::CMD:: if {([info exists tcl_platform])} {
switch $tcl_platform(platform) {
unix {
set Tutor(lsn.codeMod) {
}
}
windows {
set Tutor(lsn.codeMod) {
{if {[glob -nocomplain C:/temp] != ""} {
regsub "/tmp" $line "/temp" line
}
}
{if {[glob -nocomplain C:/windows/temp] != ""} {
regsub "/tmp" $line "/windows/temp" line
}
}
{if {[glob -nocomplain C:/winnt/temp] != ""} {
regsub "/tmp" $line "/winnt/temp" line
}
}
}
}
mac {
set Tutor(lsn.codeMod) {
}
}
default {
puts "I don't recognize the platform: $tcl_platform(platform)"
puts "Can't set platform specific parameters"
}
}
}
:LESSON_TEXT_START_LEVEL 0:
Tcl supports an interface to the file system using the buffered i/o mechanism.
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.
- open
fileName ?access? ?permission?
- Opens a file and returns a token to be used when accessing the file
via
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).
- 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:
- There is a blank line in the file.
- The current location is at the end of the file. (An EOF occurs.)
- puts ?-nonewline?
?fileID? string
- Writes the characters in string to the stream referenced by fileID.
FileID is one of:
- The value returned by a previous call to
open with write access.
- stdout
- stderr
- 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.
- fileID
is one of:
- a File identifier returned by
open
- stdin
- stdout
- stderr
- offset
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
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.
:TEXT_END:
:LESSON_TEXT_START_LEVEL 1:
Tcl supports an interface to the file system using the buffered i/o mechanism.
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.
- open
fileName ?access? ?permission?
- Opens a file and returns a token to be used when accessing the file
via
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).
- 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:
- There is a blank line in the file.
- The current location is at the end of the file. (An EOF occurs.)
- puts ?-nonewline?
?fileID? string
- Writes the characters in string to the stream referenced by fileID.
FileID is one of:
- The value returned by a previous call to
open with write access.
- stdout
- stderr
- 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.
- fileID
is one of:
- a File identifier returned by
open
- stdin
- stdout
- stderr
- offset
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
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:
:TEXT_END:
:LESSON_TEXT_START_LEVEL 2:
Tcl supports an interface to the file system using the buffered i/o mechanism.
This mechanism treats the file like a stream of characters that start at
the beginning of the file, and run one after the other to the end. This
makes a file look the same as a terminal to the program, and a program
can write a line of input to a file with the same puts command (but with one
new argument) that is used to print text to the screen. Data can be read
from a file with a gets, just as it can be read from a keyboard.
Before a file can be accessed in this manner the program has to
declare which file is to be accessed, and whether it is to be accessed for
reading, writing, or both. This declaration is made with the open
command.
Once the file is opened, the program can execute gets and
puts calls to read or write lines of data from or to the
file.
A program can also use a seek command to position a
marker within the file. After the marker has been placed, the next gets or
puts will occur from that location.
When a program is finished with a file, it should close the file. There
are a finite number of open file descriptor slots available for a program,
and if you neglect to close files, you may find your program failing when
it runs out of descriptor slots.
The file access commands are:
- open
fileName ?access? ?permission?
- Opens a file and returns a token to be used when accessing the file
via
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).
The unix file system allows you to set the amount of access that people
are allowed to have to your files. The permissions are set up as three
groups of three access modes.
The three access modes (permissions) you can set for your files are
- Read........Allow the file to be read
- Write.......Allow the file to be written
- Execute..Allow the file to be executed.
The three groups are
- User...... You.
- Group... The other people in your group
- World.... Everyone else
The file permission is set with three octal digits, each octal digit is
one group, and each bit within the digit is one access right.
World-------------------|
|
Group --------------| |
| |
User ----------| | |
___ ___ ___
000 000 000
R R R ------ Read
W W W ------ Write
X X X ------ Execute
To restrict the world from reading your files, but allow anyone within
your group read access, while only allowing yourself to write to your files,
you'd use this mask 0046. The first 0 marks this as an octal
string. The next 0 sets the access permissions for the world to no read,
no write, and no execute. The 4 sets the read bit for members of your
group. The final 6 sets read and write access for the file's owner (you).
To make a file executable, you set the low order bit. For instance,
when you write a Tcl program and save it in a file, you will set the read
and execute permissions (probably with the unix chmod command)
in order to just type the file name and execute the script.
- 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.
Fileid is one of:
- a File identifier returned by
open
- stdin
- stdout
- stderr
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:
- There is a blank line in the file.
- The current location is at the end of the file. (An EOF occurs.)
- puts ?-nonewline?
?fileID? string
- Writes the characters in string to the stream referenced by fileID.
FileID is one of:
- The value returned by a previous call to
open with write access.
- stdout
- stderr
- 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.
- fileID
is one of:
- a File identifier returned by
open
- stdin
- stdout
- stderr
- offset
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
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:
- File I/O is buffered. This means that the operating system keeps
a location in memory to which it copies data when your program writes
it out. Later, when the computer is not busy, or when a certain amount
of data has been accumulated in the buffer it will be written. Thus,
the output may not be sent out when you
expect it to be sent.
You can force data to be sent from the buffer to the disk with the flush
command. Files will all be closed and flushed when your
program exits normally, but may only be closed (not flushed) if the
program is terminated in an unexpected manner.
- There are a finite number of open file slots available. If you expect
the program to run in a manner that will cause it to open several files,
remember to close the files when you are done with them.
- An empty line is indistinguishable from an EOF with the command:
set string [gets filename]. Use the eof command to
determine if the file is at the end.
- You can't overwrite any data in a file that was opened with a
access. You can, however seek to the beginning of the file for
gets commands.
- Opening a file with the w+ access will allow you to overwrite
data, but will delete all existing data in the file.
- Opening a file with the r+ access will allow you to overwrite
data, while saving the existing data in the file, but the file must exist
before you open it.
- All data in TCL is saved as ASCII strings. This means that reading a
binary file may produce unexpected results.
:TEXT_END:
:CODE_START:
set fileid [open "/tmp/testfile" w+]
seek $fileid 0 start
puts $fileid "This is a test.\nIt is only a test"
seek $fileid 0 start
set chars [gets $fileid line1];
set line2 [gets $fileid];
puts "There are $chars characters in \"$line1\""
puts "The second line in the file is: \"$line2\""
seek $fileid 0 start
set buffer [read $fileid];
puts "\nTotal contents of the file are:\n$buffer"
close $fileid
:TEXT_END: