7

前几天我在windows 2000上下载了一个编译器(我认为是MinGW,但我不确定)(我通常是Mac用户,但它不是我的机器),下载器是MS-DOS将显示下载进度条的命令行应用程序。像这样的东西...

|---                 | 15%
...
|------              | 30%
...
...
|--------------      | 70%

除了它会在同一行上不断更新。我假设程序通过删除以前打印的字符并重新打印不同的字符来实现这一点,但我似乎无法弄清楚如何做到这一点。

我尝试过几种不同的方式打印一个“删除”字符,比如(char)8\b(甚至\r,我在某些语言中听到回溯到行首),但这些方法都不起作用。

有谁知道如何做这种事情?

编辑:这个问题已成为特定于平台的问题。我想具体了解如何在 Mac 上完成此操作。

4

2 回答 2

5

我不确定你为什么会遇到问题,但要么\b or \r可以用来做到这一点,我用过\b.

#include <iostream>
#include <iomanip>
#include <string>
#include <windows.h>

// This is the only non-portable part of this code.
// Simply pause for a specified number of milliseconds
// For Windows, we just call Sleep. For Linux, you'd
// probably call nanosleep instead (with a suitable
// multiplier, of course). Most other systems (presumably)
// have (at least vaguely) similar capabilities.
void pause(int ms) { 
    Sleep(ms);
}

static const int width = 40;    

void show_percent(int i) {
     int dashes = (width * i)/100;

     std::cout << '|' << std::left << std::setw(width) << std::string(dashes, '-') << '|' << std::setw(3) << i << "%";
}

int main() {

    for (int i=0; i<101; i++) {
        show_percent(i);
        std::cout << std::string(width+6, '\b');
        pause(100);
    }
}
于 2012-06-30T04:32:49.983 回答
2

根据维基百科

Win32 控制台根本不支持 ANSI 转义序列。软件可以使用与文本输出交错的类似 ioctl 的控制台 API 来操作控制台。一些软件在内部解释正在打印的文本中的 ANSI 转义序列,并将它们转换为这些调用 [需要引用]。

看看这个:http: //msdn.microsoft.com/en-us/library/ms682073.aspx

我相信SetConsoleCursorPosition这是允许您替换文本的原因。

于 2012-06-30T04:27:19.127 回答