[Linux] Der Unterschied zwischen Wagenrücklauf und Zeilenvorschub + einfache Implementierung von Countdown und Fortschrittsbalken (wenden Sie an, was Sie gelernt haben)

Vorwort: Dieser Artikel erklärt hauptsächlich den Unterschied zwischen Wagenrücklauf und Zeilenvorschub. Nachdem Sie den Unterschied zwischen Wagenrücklauf und Zeilenvorschub verstanden haben, führen wir Sie durch die Implementierung eines einfachen Countdown-Programms. Wir werden den in diesem Artikel erlernten Wagenrücklauf und Zeilenvorschub verwenden um das Gelernte anzuwenden.


1. Wagenrücklauf und Zeilenvorschub verstehen

In der C-Sprache sind viele Zeichen beteiligt, eines ist ein anzeigbares Zeichen und das andere ein Steuerzeichen. Anzeigbare Zeichen sind wie 'a', 'b' usw. und Steuerzeichen sind Zeichen wie '\n'.

\n(换行): Lassen Sie den Cursor von der aktuellen Zeile zur nächsten Zeile springen, aber es sollte beachtet werden, dass der Cursor nur vertikal nach unten springt, es ist nicht so, dass wir normalerweise die Eingabetaste drücken, der Cursor wechselt direkt die Zeile und geht zum Anfang der nächsten Zeile.
\r(回车): Bringt den Cursor an die ursprüngliche Position zurück.
Altmodische Tastaturbelegung:Bildbeschreibung hier einfügen

Testen Sie Wagenrücklauf und Zeilenvorschub und beobachten Sie das Phänomen:

(1) Sowohl \r als auch \n existieren

Phänomen : Es entspricht einem Zeilenumbruch, direkt zum Anfangscode
der nächsten Zeile springen :

#include<stdio.h>
#include<unistd.h>
int main()
{
    
    
	printf("hello world!\r\n");
	sleep(2);
	return 0;
}

Laufendes Ergebnis :
Bildbeschreibung hier einfügen

(2) \r und \n existieren nicht

Phänomen : Warten Sie 2 Sekunden, bevor Sie Hallo Welt drucken!
Aber es soll nicht zuerst sleep ausführen und dann printf ausführen, es muss von oben nach unten ausgeführt werden.
Während des Schlafens, hallo Welt! Es wird einfach nicht aktualisiert, es wird im Puffer gespeichert und der Puffer wird aktualisiert und gedruckt, nachdem das Programm beendet ist.
Code :

#include<stdio.h>
#include<unistd.h>
int main()
{
    
    
	printf("hello world!");
	sleep(2);
	return 0;
}

Laufendes Ergebnis :
Bildbeschreibung hier einfügen

(3) Nur\n

Phänomen : Äquivalent zu Zeilenvorschub + Wagenrücklauf
Erklärung : Egal ob Sie \n hinzufügen oder nicht, die Daten werden zuerst im Puffer gespeichert, und hier ist die Pufferstrategie des Puffers beteiligt: ​​Zeilenpufferung. Zeilenpufferung - Solange ein Zeilenumbruchzeichen gefunden wird, wird der Inhalt aller vorherigen Puffer einschließlich des Zeilenumbruchzeichens gelöscht. (Es gibt viele Aktualisierungsstrategien, dies ist nur eine davon.) Wenn Sie also auf \n stoßen, aktualisieren Sie zuerst den Puffer und drucken Sie die Daten nacheinander, warten Sie dann zwei Sekunden, das Programm wird beendet, und geben Sie dann die Befehlszeile aus.

(4) Nur \r

Phänomen : Schlafen Sie für 2 Sekunden, und dann können Sie die gedruckten Informationen nicht sehen, nur die Linux-Befehlszeile wird ausgegeben.
Erklärung : \r kehrt zum Anfang zurück, nachdem der Datenspeicher in den Puffer gelangt ist, warten Sie zwei Sekunden, das Programm wird beendet, drucken Sie zuerst hallo Welt! , wenn \r nach Abschluss des Druckvorgangs angetroffen wird, kehrt der Cursor zum Anfang der Zeile zurück, und dann muss die Befehlszeile gedruckt werden. Zu diesem Zeitpunkt zeigt die Befehlszeile hello Welt! Es wird überschrieben, ( das Programm endet –> die Daten im Puffer werden aktualisiert –> der Buffer-Refresh-String wird ausgedruckt ) und da die beiden Druckgeschwindigkeiten zu schnell sind, scheint das Ergebnis dasselbe zu sein wie keine printf-Ausgabe.
Hinweis: Wenn Sie „Hello World“ nicht sehen, bedeutet das nicht, dass es verworfen wurde, es wird nur vorübergehend im Puffer gespeichert.
Code :

#include<stdio.h>
#include<unistd.h>
int main()
{
    
    
	printf("hello world!\r");
	sleep(2);
	return 0;
}

Laufendes Ergebnis :
Bildbeschreibung hier einfügen
Ergänzung :
Verwenden Sie hier nach printf fflush(stdout);, um den Puffer zuerst zu aktualisieren hallo Welt! Drucken Sie es aus, schlafen Sie und warten Sie 2 Sekunden, um das Programm zu beenden. Sie können den Vorgang deutlich sehen.

2. Einfache Implementierung des Countdown-Programms

#include<stdio.h>
#include<unistd.h>
int main()
{
    
    
	int i = 10;
	while(i, i >= 0, i--)
	{
    
    
        printf("%2d\r",i);//输出两位数,10以后要在第二位刷新数据,所以用%2d
		fflush(stdout);//刷新缓冲区
		sleep(1);
	}
	printf("\n");
	return 0;
}

3. Realisieren Sie das Fortschrittsbalkenprogramm

Erstellen Sie 4 Dateien im aktuellen Verzeichnis wie folgt:
Bildbeschreibung hier einfügen

//proc.h头文件
#pragma once

#include<stdio.h>

extern void process();   

//proc.c进度条的具体实现函数
#include"proc.h"
#include<unistd.h>
#include<string.h>

#define STYLE '='//进度条字符,可定义你们想要的样式
#define SIZE 102 //给'\0',>箭头留两个位置
#define ARR '>'//进度条前面的箭头,加载完毕箭头消失
 
void process()
{
    
    
     const char* lable="|/-\\";//选择光标
     char bar[SIZE];//存放进度字符的数组
     memset(bar,'\0',sizeof(bar));//初始化进度条数组
 
     int i=0;
     while(i<=100)
     {
    
    
     	 //打印进度条,添加背景颜色为荧光绿,还有%进度,以及旋转光标
         printf("[\033[42;32;31m%-100s\033[0m][%d%%][%c]\r",bar,i,lable[i%4]);                                                                                                    
         fflush(stdout);//由于printf是以\r结尾,所以我们需要将缓冲区的结果刷新到显示屏上
         bar[i++]=STYLE;
         //加载完毕,箭头消失
         if(i!=100)
             bar[i]=ARR;
 
         usleep(100000);
     }
     printf("\n");
 }
 
 //main.c主函数,去调用进度条函数
 #include"proc.h"
                                                                                                                                                                                  
 int main()
 {
    
    
     process();
     return 0;
 }

//Makefile项目自动化构建工具
Processbar:main.c proc.c
     gcc main.c proc.c -o Processbar 
 .PHONY:
 clean:
     rm -f Processbar  

Laufendes Ergebnis des Fortschrittsbalkens :
Bildbeschreibung hier einfügen

Je suppose que tu aimes

Origine blog.csdn.net/weixin_63449996/article/details/130080074
conseillé
Classement