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: "")