如何读取单词的数量?
行具有以下格式:
vertices_count
X, Y
X, Y
X, Y
(X,Y对可以在同一行)
例如:
3
12.5, 56.8
12.5, 56.8
12.5, 56.8
我想阅读vertices_count个字数(转义逗号):
因此,对于上述示例,阅读单词应为:
12.5 56.8 12.5 56.8 12.5 56.8
答案 0 :(得分:1)
我仍然不清楚完全你在追求什么。以下是从命名文件中读取数据的一些代码。从您的其他问题来看,您可以在输入流中包含多组数据,此代码将它们全部作为列表返回。列表的每个元素都是一组坐标
# Read the input from file
set fil [open filename.file]
set input [read $fil]
close $fil
set data [list]; # No output so for
set seekCount yes; # Next token is a vertex count
foreach token [string map {, " "} $input] {
# Convert commas to spaces
if {$seekCount} {
set nCoords [expr $token * 2];
# Save number of coordinates
set datum [list]; # Clean out vertex buffer
} else {
lappend datum $token; # Save coordinate
incr nCoords -1
if {$nCoords <= 0} {
# That was the last coordinate
lappend data $datum; # Append the list of coordinates
set seekCount yes; # and look for anopther count
}
}
}
这是一个非常快速和肮脏的解决方案,它不会尝试处理错误。然而,它应该处理的一件事是在逗号后面是空格和丢失空格的变量。
祝你好运,我希望这会有所帮助。答案 1 :(得分:1)
set fh [open f r]
gets $fh num
read $fh data
close $fh
set number_re {-?\d+(?:\.\d*)?|-?\d*\.\d+}
set vertices {}
foreach {_ x y} [regexp -inline -all "($number_re),\\s*($number_re)" $data] {
lappend vertices $x $y
if {[llength $vertices] == $num * 2} break
}
puts $vertices
# => 12.5 56.8 12.5 56.8 12.5 56.8
while {[llength $vertices] < $num * 2} {
gets $fh line
foreach {_ x y} [regexp -inline -all "($number_re),\\s*($number_re)" $line] {
lappend vertices $x $y
if {[llength $vertices] == $num * 2} break
}
}
close $fh
答案 2 :(得分:1)
此过程首先读取一个计数行,然后读取该行数并将其作为列表放入$ varName。它返回$ varName中的元素数,如果在读取计数之前发生EOF,则返回-1。
proc getNLines {stream varName} {
upvar 1 $varName lines
set lines {}
if {[gets $stream n] < 0} {
return -1
}
while {$n > 0} {
if {[gets $stream line] < 0} {
error "bad data format"
}
lappend lines $line
incr n -1
}
return [llength $lines]
}
while {[getNLines stdin lines] >= 0} {
# ...
}