繁体   English   中英

如何从cout回滚线?

[英]How to rollback lines from cout?

我正在编写一个任务监控,它使用cout更新任务的进度。 我想在每行显示一个任务进度,因此我必须回滚几行控制台。

我坚持“几个”因为\\b完成了一行的工作,但没有删除行之间的\\n

我试过std::cout.seekp(std::cout.tellp() - str.length()); 但是tellp()返回-1(失败)。

你可以做cout << '\\r'; 跳转到当前行的开头,但向上移动是特定于系统的。 对于Unix,请参阅man termcapman terminfo (并搜索cursor_up )。 在ANSI兼容的终端(例如Unix上可用的大多数现代终端)上,这可以向上移动: cout << "\\e[A";

不要尝试在cout ,它在大多数情况下都是无法搜索的(除非重定向到文件时)。

正如其他答案中所提到的,使用ncurses (或slang )库为Unix上的终端I / O提供了一个很好的抽象。

你可以做\\r + clr_eolstd::cout << "\\r\\e[K" << std::flush ,而不是填充空格(容易出错,因为不是每个终端都是80个字符)。 。

如果可以,使用输出格式库,如ncurses ; 这显着简化了终端操作。

C和C ++都没有定义这样的东西。 您需要明确的终端操作。 在Unix上你可以使用curses 不知道Windows的用途是什么。

我知道这是一个旧帖子,但接受的不包括cout被管道传输到程序或文件的情况,这是我的谷歌搜索的顶部。 以下将处理管道和非管道stdout,行为略有不同。

#include <iostream>
#include <functional>
#include <stdio.h>

#ifdef _WIN32
#include <io.h>
#else
#include <unistd.h>
#define _isatty isatty
#define _fileno fileno
#endif

const std::function<void(const size_t&)> progress_printer(_isatty(_fileno(stdout)) == 1 ?
    [](const size_t& i) {
        std::cout << "\rNumber " << i << std::flush;
    } :
    [](const size_t& i) {
        static std::ios::off_type last(-1);
        if(last != -1)
            std::cout.seekp(last, std::ios::beg);
        last = std::cout.tellp();
        std::cout << "Number " << i << std::endl;
    }
);

这在Windows上未经测试,但应该可以使用。 它的作用是检测文件描述符或者是tty。 如果是那么它只是写'\\ r'如果pos自上次打印或换行后没有改变。 如果它不是换行符,它会在打印后找到它的最后一个位置。

文件的行为与tty的行为不同。 对于文件,如果某些内容在打印之间输出到流,则它可以覆盖部分或全部写入的内容,即使在换行之后也是如此。 对于ttys,它只是覆盖当前行开头的字符。

希望它有所帮助;)[它应该适用于Linux。]

// "\e[0K" Clear line from cursor to the end
cout << "\e[A\r\e[0K"<<what_you_want<<endl;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM