分类:
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