在我的终端(zsh)中,这段代码不打印任何内容
import Foundation
while (true){
print(".", terminator: "")
sleep(1)
print(String(Character(Unicode.Scalar(8))), terminator: "")
}
print
执行缓冲(参见这个和这个),因此您要求它打印的内容不会被打印(留在缓冲区中),直到缓冲区被刷新。(相关)当,例如,一个新的行字符被打印出来,或者当你的程序结束时,缓冲区被刷新。但在代码中,这两件事都不会发生,缓冲区也不会刷新,因此不会打印任何内容。
C函数fflush
刷新一个给定的文件句柄,您可以使用它来刷新stdout
:
while (true){
print(".", terminator: "")
fflush(stdout)
sleep(1)
print(String(Character(Unicode.Scalar(8))), terminator: "")
fflush(stdout)
}
(FileHandle.standardOutput.synchronize()
据称是这样做的更快速的方式,但它似乎不适合我)
现在你应该看到一个不闪烁的点。这是因为在打印网点和打印退格之间只需要等待1秒,而在打印退格和打印网点之间根本不需要等待。你应该在一次迭代中等待两次。
还有一个问题是,只是打印退格不足以删除点。打印退格只是将光标移回。您必须在那里打印另一个空白字符来替换点,但是现在光标向右移动了一个空格,因此在打印下一个点时,您还需要打印退格。
while (true){
sleep(1)
print(".", terminator: "")
fflush(stdout)
sleep(1)
print("u{0008} u{0008}", terminator: "")
fflush(stdout)
}
另一种擦除点的方法是使用VT100转义码:
print("u{001B}[2Ku{001B}[1D", terminator: "")