You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何从控制台左上角打印文本?(C/C++实现)

在Linux下用C/C++实现类似watch的动态左上角打印效果

要实现类似watch -n 1 pwd的效果,核心是利用Linux终端支持的ANSI转义序列控制光标位置与屏幕刷新,配合定时循环更新内容。以下是具体实现方案:

实现核心思路

  • 用\033[H强制将光标移动到屏幕左上角
  • 用\033[2J清空整个屏幕(或\033[0J清除光标到屏幕末尾的内容)
  • 可选通过\033[?25l隐藏光标,避免刷新时的光标闪烁
  • 定时刷新内容,每次循环后睡眠指定时长
  • 程序退出前恢复终端状态(比如重新显示光标)

C 实现示例

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <limits.h>

// 捕获Ctrl+C信号,退出前恢复光标显示
void sig_handler(int sig) {
    printf("\033[?25h");
    fflush(stdout);
    _exit(0);
}

int main() {
    signal(SIGINT, sig_handler);

    // 隐藏光标,优化视觉效果
    printf("\033[?25l");
    fflush(stdout);

    while (1) {
        // 光标移到左上角 + 清屏
        printf("\033[H\033[2J");
        fflush(stdout);

        // 获取并打印当前工作目录(模拟watch pwd的效果)
        char cwd[PATH_MAX];
        if (getcwd(cwd, sizeof(cwd)) != NULL) {
            printf("当前工作目录: %s", cwd);
        } else {
            perror("getcwd失败");
        }
        fflush(stdout);

        // 每秒刷新一次
        sleep(1);
    }

    return 0;
}

代码说明

  • \033[H\033[2J:先定位光标到左上角,再清屏,确保每次输出从干净的起始位置开始
  • fflush(stdout):强制刷新输出缓冲区,避免内容积压无法即时显示
  • 信号处理函数:捕获Ctrl+C中断,恢复光标后退出,防止终端光标一直隐藏
  • getcwd:获取当前工作目录,模拟pwd的输出内容

C++ 实现示例

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <limits.h>
#include <cstring>
#include <errno.h>

void sig_handler(int sig) {
    std::cout << "\033[?25h" << std::flush;
    _exit(0);
}

int main() {
    signal(SIGINT, sig_handler);

    // 隐藏光标
    std::cout << "\033[?25l" << std::flush;

    while (true) {
        // 光标移到左上角并清屏
        std::cout << "\033[H\033[2J" << std::flush;

        char cwd[PATH_MAX];
        if (getcwd(cwd, sizeof(cwd)) != nullptr) {
            std::cout << "当前工作目录: " << cwd;
        } else {
            std::cerr << "getcwd失败: " << strerror(errno);
        }
        std::cout << std::flush;

        // 每秒刷新一次
        sleep(1);
    }

    return 0;
}

代码说明

C++版本逻辑与C一致,仅用std::cout替代printf,注意每次输出后调用std::flush刷新缓冲区,保证内容即时显示。


注意事项

  • 兼容性:Linux主流终端(xterm、gnome-terminal、Konsole等)均支持ANSI转义序列,无需额外配置
  • 刷新粒度:若需要更精细的定时,可替换sleep为usleep(比如usleep(500000)实现500毫秒刷新一次)
  • 编译方式:直接用gcc/g++编译即可,无需额外依赖库:
    • C代码:gcc watch_sim.c -o watch_sim
    • C++代码:g++ watch_sim.cpp -o watch_sim

内容的提问来源于stack exchange,提问作者konchy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:55:27