[Linux] Anatomía detallada del subprograma de la barra de progreso (lleno de detalles)

​​​​​inserte la descripción de la imagen aquí

prefacio

Hola a todos, bienvenidos a la serie YY drop Linux, ¡una cálida bienvenida! El contenido principal de este capítulo es para veteranos que han estado en contacto con Linux. El contenido principal incluye
inserte la descripción de la imagen aquí

¡Bienvenido a suscribirse a la columna YY drop Linux! ¡Más productos secos se actualizan continuamente! ¡El siguiente es el portal!

Suscríbete a la columna que lee: Serie "Linux" de YY❀❀❀❀❀
【Linux Series-P1】Construyendo un entorno Linux
[Linux Series-P2] Conocimientos básicos e instrucciones de Linux
【Serie Linux-P3】Permisos de Linux
[Linux series-P4] Herramientas básicas de Linux [yum] [vim]

1. Configuración en Linux

  • Use vim para crear [main.c] [makefile] [processbar] [processBar.c] [processbar.h], que se puede configurar según la situación específica, y hay un breve código al final del artículo;
  • El archivo makefile se muestra en la figura
    inserte la descripción de la imagen aquí> - ./processbar Ejecutar el programa

Detalles: ¿por qué no incluir el archivo de encabezado en el archivo MAKE?

  • El archivo de encabezado está en el directorio actual del código fuente y el compilador encontrará automáticamente el archivo de encabezado.

2. Conceptos esenciales

1. La diferencia entre retorno de carro y salto de línea

  • Enter: el cursor vuelve al extremo izquierdo de la línea actual
  • Nueva línea: salta a la siguiente línea actual
  • PD: Ahora el ENTER de nuestro teclado tiene las funciones de retorno de carro y avance de línea al mismo tiempo .
  • En lenguaje C, "\n" significa retorno de carro más avance de línea, y "\r" simplemente se refiere a retorno de carro;

2. Concepto de amortiguación

Introducción: Un búfer es un segmento de memoria mantenido por el lenguaje C

  • El lenguaje C abrirá tres archivos de entrada y salida de forma predeterminada, a saber, el flujo de entrada estándar stdin, el flujo de salida estándar stdout y el error estándar stderr

  • En el subprograma de la barra de progreso, debemos prestar especial atención a la salida estándar del flujo de salida estándar.
    inserte la descripción de la imagen aquí

1. Diferencias en los efectos de "\n" y "\r" en el búfer

  • Como todos sabemos, en Linux, una pantalla puede tratarse como un archivo;
  • Y la pantalla se actualiza de forma predeterminada , es decir, cuando el contenido de salida coincide con "\n", ingresará directamente + avance de línea e imprimirá el contenido en la pantalla inmediatamente, y el cuadro de operación aparecerá después de que termine la suspensión;
  • Y cuando el contenido de salida coincida con "\r", se enviará primero al búfer y se enviará junto con el cuadro de operación después de que finalice la suspensión ;
#include <stdio.h>
int main()
{
    
    
 printf("hello Makefile!\n");先行打印,待睡眠结束后才弹出操作框
 sleep(3);
 return 0;
 
 printf("hello Makefile!\r");待睡眠结束后才会和操作框一起打印
}

Función Two.fflush

  • fflush es una función en la biblioteca de entrada y salida estándar del lenguaje C. Su función es vaciar la información en la secuencia.Esta función se usa generalmente para procesar archivos de disco. fflush() obligará a que los datos del búfer se vuelvan a escribir en el archivo especificado por el flujo de parámetros.
  • En el siguiente bloque de código, debería aparecer "¡Hola Makefile!" con el cuadro de operación después de que finalice la suspensión y almacenarse en el búfer antes de eso, pero usamos fflush(stdout); (stdout es su tipo de datos) para escribir directamente el contenido del búfer de vuelta al archivo de visualización;
  • El efecto final es: imprima primero, y el cuadro de operación aparecerá después de que termine la suspensión
#include <stdio.h>
int main()
{
    
    
 printf("hello Makefile!\r");
 fflush(stdout);
 sleep(3);
 return 0;
}

3. Aplicación de la función fflush: función de cuenta regresiva

1. El principio de realización de la función de cuenta regresiva.

  • Use retorno de carro continuo y actualice para lograr

2. Detalles de representación de tipos de datos

  • Mostrar números de 2 dígitos printf("%2d\r", cnt);
  • En este momento, la función es normal [10, 9, 8...1, 0]
  • Alinear a la izquierda printf(“%-2d\r”, cnt);

3. El código completo de la función de cuenta regresiva.

#include <stdio.h>
#include <unistd.h>
int main()
{
    
    
  int cnt=10;倒计时功能
  while(cnt>=0)
  {
    
    
    printf("%d\r",cnt);              此时屏幕出现【109080...1000】,功能异常;
    fflush(stdout);
    cut--;
    sleep(1);
  }
  return 0;
}

3. Diseña las distintas partes de la barra de progreso

1. Diseña la parte principal de la barra de progreso

1. Reserve espacio para la barra de progreso al imprimir

  • Diseñe una matriz de caracteres e inicialícela, en este momento es una cadena vacía ;
memset(bar, 0 ,sizeof(bar));

2. Ajuste la dirección de carga del cuerpo principal de la barra de progreso

  • En el entorno Linux, la línea está alineada a la derecha de forma predeterminada, por lo que con el retorno de carro y el salto de línea continuos, el efecto de la barra de progreso es moverse de derecha a izquierda;
  • Solo tenemos que cambiar a [%-100s]
 printf("[%-100s]\r", bar);

3. Código de la parte principal de la barra de progreso

#include <unistd.h>
int main()
{
    
    
  int i = 0;
  
  char bar[102];
  memset(bar, 0 ,sizeof(bar));
  
  while(i <= 100 )
 {
    
    
   printf("[%-100s]\r", bar);
   fflush(stdout);
   bar[i++] = '#';
   usleep(10000);
 }
}

2. Diseña la parte de progreso porcentual

1. Detalles del diseño: "Cómo representar %"

  • Detalles: dado que [% + '' letra es el tipo de datos], la barra inclinada [%] está representada por [%%]

2. Principio de implementación

  • mientras bucle
int main()
{
    
    
 int i = 0;
 while(i <= 100 )
 {
    
    
 printf("[%d%%]",i);
 fflush(stdout);
 }
 return 0;
}

3. Diseña la parte del cursor giratorio

1. Detalles del diseño: "\ Cómo representar"

  • Detalles: dado que [\ +'' es un carácter de escape], la barra inclinada [\] está representada por [\\]

2. Principio de implementación

  • La cadena constante coincide con [i++% 4]
  • [-r Enter] + [fflush refresh icon]; La siguiente ronda del bucle while sobrescribe directamente los caracteres originales para realizar la rotación del cursor;
int main()
{
    
    
  int i = 0;
  const char *lable="|/-\\";
  while(i <= 100 )
  {
    
    
    printf("[%c]\r",lable[i++%4]);
    fflush(stdout);
  }
}

4. El código completo de la barra de progreso.

#include <unistd.h>
#include <string.h>
int main()
{
    
    
  int i = 0;
  char bar[102];
  memset(bar, 0 ,sizeof(bar));
  const char *lable="|/-\\";
  while(i <= 100 )
 {
    
    
   printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
   fflush(stdout);
   bar[i++] = '#';
   usleep(10000);
 }
  printf("\n");
  return 0;
}

Supongo que te gusta

Origin blog.csdn.net/YYDsis/article/details/131776415
Recomendado
Clasificación