TCL中flush的使用

Use of flush in TCL

我正在以交互方式通过 TCL 工作。我写了类似的东西:

puts -nonewline "Enter file you want to read : "
# flush stdout
gets stdin fileName

# TCL statements follow...

flush 被注释时,puts 消息在取消注释时没有被打印出来,脚本正在进一步执行。 我在这里阅读了关于同一问题的问题:[

但我也有用户在评论中提出的相同问题:

puts 将其输出定向到 stdout,而 gets 查找来自 stdin 的输入。 那么为什么我们首先需要使用 flush 呢? 如果我做类似的事情:

puts -nonewline "message1 ,,"
puts -nonewline "message2 ,"
puts "message 3."

我在这里不需要任何刷新语句,那为什么在前面的例子中呢?

请帮助我理解这一点。 谢谢

默认情况下,当打开通道写入控制台或终端时,它会进入行缓冲模式,以便只写入完整的行(也就是说,只要写入以换行符结束,就会进行刷新; puts 如果没有被告知不要这样做,则添加一个)。这通常是正确的做法,但在像您这样编写提示时就不是这样了。 (当一个通道对其他任何东西开放时,它开始时是完全缓冲的;这使得批量数据操作的速度更快。)唯一的例外是 stderr,它 始终未缓冲 默认;那是因为我们想确保程序失败时写入的任何内容都能真正解决(因为 stderr 用于诊断信息)。

您可以使用 chan configurefconfigure 更改通道的缓冲(取决于 Tcl 版本)。这在某些情况下是非常可取的,例如在使用 line-oriented 网络协议时。或者您可以在需要时明确地flush

Tcl 在您 close 时刷新通道。

刷新对从通道读取完全没有影响。