分类:
2011-03-21 10:26:45
TCL
提供几种读写文件的方法,最简单的方法是使用
gets
和
puts
。数据量大的时候,使
用
read
加载文件,在使用
split
解析更有效。
这些方法还可以用于
socket
和管道上的通信,还可以用于存储内存中的虚拟文件系统。
下面介绍上述过程中用到的几个基本的文件输入输出命令。
open fileName ?access? ?permission?
open
命令
以
access
方式打开文件
name
。返回供其他命令
(gets,close
等
)
使用
的文件标识。如果
name
的第一个字符是“
|
”,管道命令被触发,而不是打开文件。
文件的打开方式和我们熟悉的
C
语言类似,有以下方式:
r
只读方式打开。文件必须已经存在。这是默认方式。
r+
读写方式打开,文件必须已经存在。
w
只写方式打开文件,如果文件存在则清空文件内容,否则创建一新的空文件。
w+
读写方式打开文件,如文件存在则清空文件内容,否则创建新的空文件。
a
只写方式打开文件,文件必须存在,并把指针指向文件尾。
a+
读写方式打开文件,并把指针指向文件尾。如文件不存在,创建新的空文件。
open
命令返回一个字符串用于表识打开的文件。当调用别的命令(如:
gets,puts,close
,〕对打开的文件进行操作时,就可以使用这个文件标识符。
TCL
有三个特定的文件标识:
stdin,stdout
和
stderr
,分别对应标准输入、标准输出和错误通道,任何时候你都可以使用这三个文件标识。
gets
fileId ?varName?
读
fileId
标识的文件的下一行,忽略换行符。如果命令中有
varName
就把该行赋给它,并返回该行的字符数(文件尾返回
-1
),如果没有
varName
参数,返回文件的下一行作为命令结果(如果到了文件尾,就返回空字符串)。
和
gets
类似的命令是
read
,不过
read
不是以行为单位的,它有两种形式:
read ?-nonewline? fileId
读并返回
fileId
标识的文件中所有剩下的字节。如果没有
nonewline
开关,则在换行符处停止。
read
fileId numBytes
在
fileId
标识的文件中读并返回下一个
numbytes
字节。
puts
?-nonewline? ?fileId? string puts
命令把
string
写到
fileId
中,如果没有
nonewline
开关的话,添加换行符。
fileId
默认是
stdout
。命令返回值为一空字符串。可能的输出对象有:
The
value returned by a previous call to open with write access.
stdout
stderr
puts
命令使用
C
的标准
I/O
库的缓冲区方案,这就意味着使用
puts
产生的信息不会立即出现在目标文件中。如果你想使数据立即出现在文件中,那你就调用
flush
命令:
flush
fileId
把缓冲区内容写到
fileId
标识的文件中,命令返回值为空字符串。
flush
命令迫使缓冲区数据写到文件中。
flush
直到数据被写完才返回。当文件关闭时缓冲区数据会自动
flush
。
close ?fileId?
关闭标识为
fileId
的文件,命令返回值为一空字符串。
这里特别说明的一点是,
TCL
中对串口、管道、
socket
等的操作和对文件的操作类似,以上对文件的操作命令同样适用于它们。
可以使用
seek
命令来改变文件的访问点:
seek fileId
offset ?origin?
把
fileId
标识的文件的访问点设置为相对于
origin
偏移量为
offset
的位置。
origin
可以是
start
,
current
,
end
,默认是
start
。命令的返回值是一空字符串。
例如:
seek fileId
2000
改变
fieleId
标识的文件访问点,以便下次读写开始于文件的第
2000
个字节。
seek
的第三个参数说明偏移量从哪开始计算。第三个参数必为
start,current
或
end
中的一个。
start
是默认值:即偏移量是相对文件开始处计算。
current
是偏移量从当前访问位置计算。
end
是偏移量从文件尾开始计算。
如果文件以
"a"
模式打开,当前位置不能设置为文件中间,但是读可以设置为文件开始处。
tell fileId
返回
fileId
标识的文件的当前访问位置。返回值为
10
进制字符串。
eof fileId
如果到达
fileId
标识的文件的末尾返回
1
,否则返回
0
。
再总结一下
TCL
文件访问的注意点:
1,
程序正常退出,文件会关闭并且
flush
;异常退出会关闭,但是未必会
flush
。
2,
打开文件的数量是有限的,不使用时要尽快关闭
3,
使用
eof
或者
gets