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 configure
或 fconfigure
更改通道的缓冲(取决于 Tcl 版本)。这在某些情况下是非常可取的,例如在使用 line-oriented 网络协议时。或者您可以在需要时明确地flush
。
Tcl 在您 close
时刷新通道。
刷新对从通道读取完全没有影响。
我正在以交互方式通过 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 configure
或 fconfigure
更改通道的缓冲(取决于 Tcl 版本)。这在某些情况下是非常可取的,例如在使用 line-oriented 网络协议时。或者您可以在需要时明确地flush
。
Tcl 在您 close
时刷新通道。
刷新对从通道读取完全没有影响。