python控制台同行覆盖显示文本,追加,换行的原理
VC / C / C Windows 控制台 完全是同一套原理全平台 Windows 控制台底层逻辑一模一样\r\n行为、光标移动、同行覆盖、进度条刷新和 Python、VB6 完全通用。一、标准对应关系全语言通用表格转义符ASCII含义控制台行为\rChr(13)Carriage Return光标跳回本行行首不换行\nChr(10)Line Feed光标跳到下一行同列不回行首二、VC 控制台 和 Python/VB6 行为完全一致1. VC 实现「同一行覆盖刷新进度条」和 Pythonprint(\rxxx, end)逻辑一模一样#include iostream using namespace std; int main() { for (int i 0; i 100; i) { // \r 回到行首后面直接覆盖不换行 cout \r进度 i % flush; Sleep(50); } return 0; }\r 光标回到行首没有\n不自动换行flush 立刻刷到控制台不缓冲2. VC 等价 Python endprint(进度, end)cout 进度; // 不输出 \n就不会自动换行原理完全一样不输出换行符就停在当前行末尾三、底层本质Windows 控制台是统一标准不管是Python / VB6 / VC / C# / Go只要走Windows 标准控制台句柄WriteConsole对CR(13)/LF(10)的解析行为系统内核统一处理不是语言自己实现的是Windows 控制台宿主统一解析看到CR(13)→ 光标移到本行第 0 列看到LF(10)→ 光标向下走一行没有 LF → 停在原地后续文字原地覆盖 / 追加四、关键细节你刚好用到的场景所有语言同行进度条写法通用都靠\r回行首 不输出\n实现覆盖刷新。缓冲问题Python 要flushTrue、C 要flush、VB6 WriteConsole 直接无缓冲都是为了不卡在缓冲区立即显示。Unix/Linux 稍有区别Linux 经常把\n自动附带回车回行首但Windows 严格分开 CR/LFVB6/Python/VC 行为完全对齐。一句话总结VC 控制台和 Python、VB6 是同一套 Windows 标准 CR/LF 规则\r(13)回行首、\n(10)换行、不输出换行符就停在当前行原理、用法、效果 100% 一样。挖到计算机历史根源了这事根本不是 Windows 乱设计是老式电传打字机 TTY / 打字机硬件 遗传下来的历史包袱我给你把逻辑讲通透立马就懂为啥回车只回行首、换行只下移。1. 先还原最早不是屏幕是机械打字机 / 电传机几十年前没有显示器是纸 打印头的机器打印头在纸上从左往右打字打到行末尾要做两个机械动作回车 Carriage ReturnCR Chr13把整个打印小车 猛地拉回最左侧起点换行 Line FeedLF Chr10把纸张向上卷一行留出下一行打印位置两个是独立机械动作本来就是分开的只拉小车不卷纸就是只 CR (13)→ 回到本行开头覆盖重打只卷纸不拉小车就是只 LF (10)→ 光标下移一列不变日常写完一行先回车、再换行 CRLF2. 为什么你觉得 “回车就该直接换行”因为现代键盘 手机 软件 帮你合并了现在你按 Enter系统自动帮你CRLF 一次性发两个你感官上按回车 换行但底层标准从没改还是保留老式打字机的两个独立指令。3. 你说的逻辑「不合理」其实很对按现代人屏幕直觉按回车 → 直接换行到下一行开头 才合理但控制台字符标准是 100 年前机械硬件遗留不是按屏幕 UI 设计的。Windows 死守这套\r只管归左\n只管下移绝不自作聪明合并为了兼容几十年所有老程序。4. Chr8 退格、Chr7 响铃 为啥不适合做进度条Chr8 是逐格左退要回行首要发一长串低效Chr13 是硬件级一键归行首天生就是用来原地覆写、进度条刷新的所以后人做控制台进度条清一色只用\r(13)不用退格。5. 总结一句大白话根源是老式机械电传机回车、换行是两个独立机械动作现代 Enter 键是系统帮你自动组合 CRLF骗了你的直觉底层控制台依旧保留原始规则Chr13 只回行首、不换行Chr10 只下移、不回行首就靠这两个刚好能完美实现同行覆盖、进度条刷新是历史遗留刚好撞上实用需求。你这个质疑特别到位正常人按现代屏幕思维都会觉得不合理懂了机械历史就完全释怀了。你这句完全说到点子上了我给你把老式打印机 / 电传机的真实物理逻辑讲透瞬间就全通了1. 老式针式 / 电传打印机物理真相老式打印机、电传打字机纸只能往上卷不能倒卷物理结构不支持退一行、往上回滚纸张所以LF (换行 Chr10) 只能纸向上走一行没法回头那CR 回车(Chr13)能干啥打印小车打印头那整个滑架可以左右跑CR 把小车强行拉回最左侧起点纸张位置不动还在当前行2. 所以当年天生就有三种物理状态只 CR (13)小车回最左 → 纸不动 →还在同一行后果接着在本行重新打字、覆盖只 LF (10)纸往上卷一行 → 小车还在当前列后果下一行从中间开始打CRLF 连用小车回左 纸卷一行 →下一行行首就是现在我们默认的「换行」3. 你说得太对老式打印机根本不能退行只能往前卷纸LF小车左右跑CR、退格 BS没有任何机械结构支持把纸往下退一行所以当年根本不存在「光标上移一行」这种物理能力。4. 为什么现在控制台能光标上下移动因为现代虚拟控制台是仿真出来的Windows 终端、CMD 是软件模拟老式打印机行为额外加了光标上移光标下移清屏这些都是软件额外模拟的真实老式硬件根本做不到。5. 回到你之前的疑惑正常回车应该直接换行为啥当年拆成两个因为受限于当年硬件机械结构换行是卷纸回车是拉打印小车两个独立电机、两个独立动作硬件天生就是分开的。总结老式打印机纸只能向前卷不能后退一行CR 只管小车回左LF 只管纸张走一行硬件先天拆分 → 留下了1310两个独立控制码现在 CMD / 控制台只是软件仿真老硬件规则还保留这套历史习惯也正因为只 CR 不 LF你现在才能用Chr(13)做同行覆盖进度条纯属历史遗留歪打正着。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2598757.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!