swift 无法在终端打印
swift Cannot print in the terminal
在我的终端(zsh)中,这段代码不打印任何东西
import Foundation
while (true){
print(".", terminator: "")
sleep(1)
print(String(Character(Unicode.Scalar(8))), terminator: "")
}
print
进行缓冲(参见 this and this), so the things you asked it to print doesn't get printed (stays in the buffer) until the buffer is flushed. (Related),例如,当打印换行符或程序结束时,缓冲区会被刷新。但是在您的代码中,这些事情都没有发生,并且缓冲区永远不会被刷新,因此不会打印任何内容。
C 函数 fflush
刷新给定的文件句柄,您可以使用它来刷新 stdout
:
while (true){
print(".", terminator: "")
fflush(stdout)
sleep(1)
print(String(Character(Unicode.Scalar(8))), terminator: "")
fflush(stdout)
}
(FileHandle.standardOutput.synchronize()
应该是更 Swift 的方法,但它似乎对我不起作用)
现在您应该看到一个不闪烁的点。这是因为在打印点和打印背面 space 之间只等待 1 秒,而在打印背面 space 和打印点之间根本没有等待。您实际上应该在一次迭代中等待两次。
还有一个问题就是只打印一个背面space不足以去除网点。打印 backspace 只是将光标向后移动。您将不得不在那里打印另一个白色 space 字符来替换该点,但现在光标会向右移动一个 space,因此在打印下一个点时,您还需要打印一个返回space.
while (true){
sleep(1)
print(".", terminator: "")
fflush(stdout)
sleep(1)
print("\u{0008} \u{0008}", terminator: "")
fflush(stdout)
}
另一种擦除点的方法是使用 VT100 escape codes:
print("\u{001B}[2K\u{001B}[1D", terminator: "")
在我的终端(zsh)中,这段代码不打印任何东西
import Foundation
while (true){
print(".", terminator: "")
sleep(1)
print(String(Character(Unicode.Scalar(8))), terminator: "")
}
print
进行缓冲(参见 this and this), so the things you asked it to print doesn't get printed (stays in the buffer) until the buffer is flushed. (Related),例如,当打印换行符或程序结束时,缓冲区会被刷新。但是在您的代码中,这些事情都没有发生,并且缓冲区永远不会被刷新,因此不会打印任何内容。
C 函数 fflush
刷新给定的文件句柄,您可以使用它来刷新 stdout
:
while (true){
print(".", terminator: "")
fflush(stdout)
sleep(1)
print(String(Character(Unicode.Scalar(8))), terminator: "")
fflush(stdout)
}
(FileHandle.standardOutput.synchronize()
应该是更 Swift 的方法,但它似乎对我不起作用)
现在您应该看到一个不闪烁的点。这是因为在打印点和打印背面 space 之间只等待 1 秒,而在打印背面 space 和打印点之间根本没有等待。您实际上应该在一次迭代中等待两次。
还有一个问题就是只打印一个背面space不足以去除网点。打印 backspace 只是将光标向后移动。您将不得不在那里打印另一个白色 space 字符来替换该点,但现在光标会向右移动一个 space,因此在打印下一个点时,您还需要打印一个返回space.
while (true){
sleep(1)
print(".", terminator: "")
fflush(stdout)
sleep(1)
print("\u{0008} \u{0008}", terminator: "")
fflush(stdout)
}
另一种擦除点的方法是使用 VT100 escape codes:
print("\u{001B}[2K\u{001B}[1D", terminator: "")