如何读取单词的数量?

时间:2013-07-11 08:38:50

标签: tcl

如何读取单词的数量?

行具有以下格式:

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

3 个答案:

答案 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} {
  # ...
}