c++ - 命令行工具输出后如何改变其输出?

标签 c++ node.js haskell command-line terminal

我注意到很多命令行工具(例如 wget)会将进度显示为数字或进度条,该进度条会随着进程的完成而前进。虽然这个问题并不是真正特定于语言的,但在我最常用于命令行工具的语言(C++、Node.js、Haskell)中,我还没有看到一种方法来做到这一点。

这里是一个例子,当 wget 下载一个文件时,终端的 单行 的三个快照:Beginning process Middle of process Process nearly complete

与其他信息一起,wget 会显示一个进度条 (<=>),它会在下载文件时前进。到目前为止下载的数据量(6363、179561、316053)和当前下载速度(10.7KB/s、65.8KB/s、63.0KB/s)也会更新。这是怎么做到的?

理想情况下,请包含来自上述三种语言中的一种或多种语言的代码示例。

最佳答案

只需打印一个 CR(不带换行符)来覆盖一行。下面是 perl 中的示例程序:

#!/usr/bin/env perl

$| = 1;

for (1..10) {
  print "the count is: $_\r";
  sleep(1)
}

我还禁用了输出缓冲 ($| = 1),以便打印命令立即将其输出发送到控制台而不是缓冲它。

Haskell 示例:

import System.IO
import Control.Monad
import Control.Concurrent

main = do
  hSetBuffering stdout NoBuffering
  forM_ [1..10] $ \i -> do
    putStr $ "the count is: " ++ show i ++ "\r"
    threadDelay 1000000

关于c++ - 命令行工具输出后如何改变其输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900566/

相关文章:

c++ - 在 switch 语句中从 int 到 enum 类的隐式转换

c++ - 如何将 Eigen FFT 与 MatrixXf 一起使用?

javascript - 更新 Node js Promise 函数中变量的值

javascript - 在 Node JS 中访问 JSON 的属性

Haskell:不在范围内:数据构造函数

c++ - 如何让 std::pair<char *, char *> 在 Visual Studio 的调试器中显示为正确的字符串段?

node.js - 如何通过 OctoPrint Rest API 传递命令?

haskell - Haskell 中数据类型的混淆

list - 删除列表中给定元素的第一次出现

c++ - 特殊成员函数是 noexcept 还是 throw()?