0

如何阅读字数?

行具有以下格式:

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
4

3 回答 3

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 
于 2013-07-11T09:52:54.320 回答
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
        }
    }
}

这是一个非常快速和肮脏的解决方案,它不会尝试处理错误。然而,它会处理的一件事是逗号后有大量的空格和缺失的空格。

祝你好运,我希望这会有所帮助。

于 2013-07-11T09:19:23.920 回答
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} {
  # ...
}
于 2013-07-11T13:19:17.737 回答