TCL读取#字符异常:为何#被转为{及解决方法
问题
读取文件时希望跳过首字符为#的行,但TCL会将#转换为{,执行代码后输出的首字符均为{而非#;若将首字符改为/则可正常运行。
相关文件与代码
test.txt内容
# Skip this line George Washington
TCL代码
set fileResults [readFile c:/tclPrograms/test.txt] foreach item $fileResults { set row [split $item ","] puts [string range $row 0 0] puts [string index $row 0] }
原因分析
问题出在你使用的readFile命令内部实现:它将文件内容当作TCL代码进行了解析。在TCL中,#是注释符号,解析器处理注释行时会进行特殊处理(比如将注释内容用大括号包裹或转义),导致原本以#开头的行首字符变成了{。而/不是TCL的注释符号,因此不会触发这种特殊处理,能正常读取。
解决方法
替换自定义的
readFile为标准文本读取实现
实现一个仅按原始文本读取每行的readFile命令,避免将文件内容当作TCL代码解析:proc readFile {filename} { set fileHandle [open $filename r] set fileContent [read $fileHandle] close $fileHandle # 将内容按换行符分割为行列表 return [split $fileContent "\n"] }添加跳过
#开头行的逻辑
在遍历行时,判断首字符是否为#,跳过这类行:set fileResults [readFile c:/tclPrograms/test.txt] foreach item $fileResults { # 跳过空行和#开头的行 if {$item eq "" || [string index $item 0] eq "#"} { continue } set row [split $item ","] puts [string range $row 0 0] puts [string index $row 0] }
内容的提问来源于stack exchange,提问作者newdeveloper
相关产品推荐
相关产品推荐

