当前位置: 首页 > wzjs >正文

网站建设第一品牌 网站设计长沙优化网站推广

网站建设第一品牌 网站设计,长沙优化网站推广,打金传奇rmb回收,私密浏览器免费版在线看目录 1.简介1.1 Display类原理简述 2.代码2.1 main.cpp:无注释版2.2 main.cpp:有注释版 3.编译运行 1.简介 本文介绍一个用于命令行动态覆盖输出的C实现(Display类); 效果说明: 普通输出会直接换行显示。…

目录

  • 1.简介
    • 1.1 Display类原理简述
  • 2.代码
    • 2.1 main.cpp:无注释版
    • 2.2 main.cpp:有注释版
  • 3.编译运行


1.简介

本文介绍一个用于命令行动态覆盖输出的C++实现(Display类);

效果说明:

  • 普通输出会直接换行显示。

  • 分段输出(如进度条)会在同一行动态刷新,模拟进度条效果。

  • 中文内容也能正确显示和自动换行。

  • 你可以修改max_word_per_line参数,观察自动换行效果。

.

1.1 Display类原理简述

  • Display类用于在命令行中动态刷新输出内容,适合进度条、分段日志等场景。

  • 支持中英文混合输出,自动换行。

  • 在Windows和Linux/macOS下分别做了兼容性处理。

  • 通过Print(int32_t segment_id, const std::string &s)方法输出内容:

    • segment_id为-1时为普通输出,其他值用于分段刷新。

    • 同一段内容会被“覆盖式”刷新,不同段内容会换行显示。

.

2.代码

2.1 main.cpp:无注释版

#include <iostream>
#include <string>
#include <cstdio>
#include <thread>
#include <chrono>class Display {public:explicit Display(int32_t max_word_per_line = 20): max_word_per_line_(max_word_per_line) {}virtual void Print(int32_t segment_id, const std::string &s) {
#ifdef _MSC_VERif (segment_id != -1) {if (last_segment_ != segment_id) {fprintf(stderr, "\n%d:%s", segment_id, s.c_str());last_segment_ = segment_id;} else {fprintf(stderr, "\r%d:%s", segment_id, s.c_str());}} else {fprintf(stderr, "%s\n", s.c_str());}return;
#endifif (last_segment_ == segment_id) {Clear();} else {if (last_segment_ != -1) {fprintf(stderr, "\n\r");}last_segment_ = segment_id;num_previous_lines_ = 0;}if (segment_id != -1) {fprintf(stderr, "\r%d:", segment_id);}int32_t i = 0;for (size_t n = 0; n < s.size();) {if (s[n] > 0 && s[n] < 0x7f) {fprintf(stderr, "%c", s[n]);++n;} else {std::string tmp(s.begin() + n, s.begin() + n + 3);fprintf(stderr, "%s", tmp.data());n += 3;}++i;if (i >= max_word_per_line_ && n + 1 < s.size() &&(s[n] == ' ' || s[n] < 0)) {fprintf(stderr, "\n\r ");++num_previous_lines_;i = 0;}}}private:void Clear() {fprintf(stderr, "\33[2K\r");while (num_previous_lines_ > 0) {fprintf(stderr, "\033[1A\r");fprintf(stderr, "\33[2K\r");--num_previous_lines_;}}private:int32_t max_word_per_line_;int32_t num_previous_lines_ = 0;int32_t last_segment_ = -1;
};int main() {Display display(20);display.Print(-1, "Hello, this is a normal output.");std::this_thread::sleep_for(std::chrono::seconds(1));for (int i = 0; i <= 5; ++i) {display.Print(1, "Progress: " + std::to_string(i * 20) + "%");std::this_thread::sleep_for(std::chrono::milliseconds(500));}display.Print(2, "这是一个中文测试,看看能否正确换行和显示。");std::this_thread::sleep_for(std::chrono::seconds(1));display.Print(1, "Progress: 100% 完成!");std::this_thread::sleep_for(std::chrono::seconds(1));display.Print(-1, "All done!");return 0;
}

2.2 main.cpp:有注释版

#include <iostream>
#include <string>
#include <cstdio>
#include <thread>
#include <chrono>// 用于命令行动态刷新输出的Display类
class Display {public:// 构造函数,设置每行最大字符数,默认20explicit Display(int32_t max_word_per_line = 20): max_word_per_line_(max_word_per_line) {}// 动态输出函数// segment_id: 段编号(-1表示普通输出,其他值用于分段刷新)// s: 要输出的字符串virtual void Print(int32_t segment_id, const std::string &s) {
#ifdef _MSC_VER// =========================// Windows下的输出逻辑说明// =========================// Windows终端对ANSI转义序列支持较差,因此采用简单的回车和换行控制输出。// 如果segment_id不是-1,表示需要分段输出(如进度条等):if (segment_id != -1) {// 如果当前段编号和上一次不同,先换行再输出新内容,并更新last_segment_if (last_segment_ != segment_id) {fprintf(stderr, "\n%d:%s", segment_id, s.c_str());last_segment_ = segment_id;} else {// 如果是同一段,直接用回车覆盖当前行内容fprintf(stderr, "\r%d:%s", segment_id, s.c_str());}} else {// segment_id为-1,表示普通输出,直接输出字符串并换行fprintf(stderr, "%s\n", s.c_str());}// Windows下不支持多行清除,直接返回return;
#endif// =========================// Linux/macOS下的输出逻辑// =========================// 如果是同一段,清除之前的输出(为刷新做准备)if (last_segment_ == segment_id) {Clear();} else {// 如果是新段落,先换行if (last_segment_ != -1) {fprintf(stderr, "\n\r");}last_segment_ = segment_id;num_previous_lines_ = 0;}// 如果是分段输出,先输出段编号if (segment_id != -1) {fprintf(stderr, "\r%d:", segment_id);}int32_t i = 0; // 当前行已输出字符数for (size_t n = 0; n < s.size();) {if (s[n] > 0 && s[n] < 0x7f) {// 英文字符直接输出fprintf(stderr, "%c", s[n]);++n;} else {// 中文字符(UTF-8下3字节)特殊处理std::string tmp(s.begin() + n, s.begin() + n + 3);fprintf(stderr, "%s", tmp.data());n += 3;}++i;// 达到最大行宽且下一个字符是空格或特殊字符时换行if (i >= max_word_per_line_ && n + 1 < s.size() &&(s[n] == ' ' || s[n] < 0)) {fprintf(stderr, "\n\r ");++num_previous_lines_;i = 0;}}}private:// 清除当前段的输出void Clear() {// 清除当前行:ClearCurrentLine()fprintf(stderr, "\33[2K\r");// 如果有多行输出,逐行向上清除while (num_previous_lines_ > 0) {// 光标上移一行:GoUpOneLine()fprintf(stderr, "\033[1A\r");// 清除当前行:ClearCurrentLine()fprintf(stderr, "\33[2K\r");--num_previous_lines_;}}private:int32_t max_word_per_line_;      // 每行最大字符数int32_t num_previous_lines_ = 0; // 之前输出的行数int32_t last_segment_ = -1;      // 上一次输出的段编号
};int main() {Display display(20);// 普通输出display.Print(-1, "Hello, this is a normal output.");std::this_thread::sleep_for(std::chrono::seconds(1));// 段落1,模拟进度刷新for (int i = 0; i <= 5; ++i) {display.Print(1, "Progress: " + std::to_string(i * 20) + "%");std::this_thread::sleep_for(std::chrono::milliseconds(500));}// 段落2,输出中文display.Print(2, "这是一个中文测试,看看能否正确换行和显示。");std::this_thread::sleep_for(std::chrono::seconds(1));// 段落1,再次刷新display.Print(1, "Progress: 100% 完成!");std::this_thread::sleep_for(std::chrono::seconds(1));// 普通输出display.Print(-1, "All done!");return 0;
}

3.编译运行

# 在Linux/macOS上
g++ -std=c++11 -o main main.cpp
./main# 在Windows(PowerShell/CMD)上
g++ -std=c++11 -o main.exe main.cpp
.\main.exe

注意:

  • Windows下建议使用PowerShell或WSL终端,CMD对ANSI转义序列支持较差,刷新效果可能不理想。

  • 中文输出需保证终端支持UTF-8编码。

.


声明:资源可能存在第三方来源,若有侵权请联系删除!

http://www.dtcms.com/wzjs/277710.html

相关文章:

  • 果洛州公司网站建设友の 连接
  • 高端定制服装站长之家 seo查询
  • 公众平台有哪些山西seo基础教程
  • 怎么用dw做带登陆的网站网站搜什么关键词
  • 内蒙古自治区工程建设网站数据分析师培训机构
  • 上海住远建设工程监理公司网站今天百度数据
  • 网站测试域名301怎么做mac日本官网入口
  • 网站开发的岗位及职责推广公司简介
  • .net怎么做网站网络黄页推广大全
  • 打开百度搜索网站百度上怎么发布信息啊
  • 网站建设收费明细站长之家seo综合
  • 有什么做ppt的网站吗全网营销平台
  • 长沙做网站要多少钱做网站的软件有哪些
  • 做网站在阿里云买什么软件免费b站推广软件
  • 手机客户端网站建设windows优化大师免费版
  • 我想建个赌博网站怎么建域名网络营销的优势与不足
  • 大兴手机网站建设郑州seo优化
  • 天津企业网站专业订制惠州搜索引擎seo
  • wordpress授权登录界面seo系统培训课程
  • 设计网站首页网络营销是以什么为基础
  • 阜阳做网站的公司软件开发公司联系方式
  • 网站建设湛江防控措施持续优化
  • 建设部设计规范网站网络营销的模式有哪些?
  • 河南网站制作价格头条搜索
  • 网站开发工程师需要具备的综合素质seo优化排名经验
  • 收费用的网站怎么做最近五天的新闻大事
  • 百度网站公司信息推广怎么做推广有奖励的app平台
  • 网站栏目设置说明软文世界官网
  • 郑州营销型网站制作教程好看的html网页
  • 青海公路建设信用信息服务网站自己怎么开网站