[Linux] Углубленная анатомия апплета индикатора выполнения (полное деталей)

​​​​​вставьте сюда описание изображения

предисловие

Привет всем, добро пожаловать в серию YY drop Linux, теплый прием! Основное содержание этой главы предназначено для ветеранов, имевших дело с Linux.
вставьте сюда описание изображения

Добро пожаловать, чтобы подписаться на колонку YY drop Linux! Больше галантереи постоянно обновляется! Ниже портал!

Подпишитесь на колонку, читающую: серия YY "Linux"❀❀❀❀❀
【Linux Series-P1】Создание среды Linux
[Linux Series-P2] Базовые знания и инструкции по Linux
【Linux Series-P3】Разрешения Linux
[Серия Linux-P4] Основные инструменты Linux [yum] [vim]

Оглавление

1. Настройки в Linux

  • Используйте vim для создания [main.c] [makefile] [processbar] [processBar.c] [processbar.h], которые можно настроить в соответствии с конкретной ситуацией, а в конце статьи есть краткий код;
  • Файл makefile показан на рисунке
    вставьте сюда описание изображения> - ./processbar Выполнить программу

Подробности: почему бы не включить заголовочный файл в makefile?

  • Заголовочный файл находится в текущем каталоге исходного кода, и компилятор автоматически найдет заголовочный файл.

2. Основные понятия

1. Разница между возвратом каретки и переводом строки

  • Enter: курсор возвращается в левый конец текущей строки
  • Новая строка: перейти к текущей следующей строке
  • PS: Теперь клавиша ENTER на нашей клавиатуре одновременно выполняет функции возврата каретки и перевода строки .
  • В языке C "\n" означает возврат каретки плюс перевод строки, а "\r" просто означает возврат каретки;

2. Концепция буфера

Введение: буфер — это сегмент памяти, поддерживаемый языком C.

  • Язык C по умолчанию открывает три файла ввода и вывода, а именно стандартный поток ввода stdin, стандартный поток вывода stdout и стандартную ошибку stderr.

  • В апплете индикатора выполнения мы должны обратить особое внимание на стандартный поток вывода stdout.
    вставьте сюда описание изображения

1. Различия в эффектах "\n" и "\r" в буфере

  • Как мы все знаем, в Linux отображение можно рассматривать как файл;
  • И дисплей по умолчанию обновляет строку , то есть, когда выходной контент соответствует «\n», он будет напрямую вводить + перевод строки и немедленно печатать контент на экране, а окно операции появится после окончания сна;
  • И когда выходное содержимое соответствует "\r", оно сначала будет выведено в буфер, а после завершения сна будет выведено вместе с полем операции ;
#include <stdio.h>
int main()
{
    
    
 printf("hello Makefile!\n");先行打印,待睡眠结束后才弹出操作框
 sleep(3);
 return 0;
 
 printf("hello Makefile!\r");待睡眠结束后才会和操作框一起打印
}

Функция Two.fflush

  • fflush — это функция в стандартной библиотеке ввода-вывода языка C. Ее функция — сбрасывать информацию в потоке.Эта функция обычно используется для обработки файлов на диске. fflush() принудительно запишет данные из буфера обратно в файл, указанный потоком параметров.
  • В следующем блоке кода «hello Makefile!» должно быть выведено с окном операции после окончания сна и сохранено в буфере перед этим; но мы использовали fflush(stdout); (stdout — его тип данных) для прямой записи содержимого из буфера обратно в файл отображения;
  • Конечный эффект: сначала распечатайте, а окно операции появится после окончания сна.
#include <stdio.h>
int main()
{
    
    
 printf("hello Makefile!\r");
 fflush(stdout);
 sleep(3);
 return 0;
}

3. Применение функции fflush: функция обратного отсчета

1. Принцип реализации функции обратного отсчета

  • Используйте непрерывный возврат каретки и обновление для достижения

2. Детали представления типов данных

  • Вывести двузначные числа printf("%2d\r", cnt);
  • В это время функция нормальная [10, 9, 8...1, 0]
  • Выровнять по левому краю printf("%-2d\r", cnt);

3. Полный код функции обратного отсчета

#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. Создайте различные части индикатора выполнения

1. Дизайн основной части индикатора выполнения

1. Зарезервируйте место для индикатора выполнения при печати

  • Создайте массив символов и инициализируйте его, на данный момент это пустая строка ;
memset(bar, 0 ,sizeof(bar));

2. Отрегулируйте направление загрузки основной части индикатора выполнения.

  • В среде Linux строка по умолчанию выравнивается по правому краю, поэтому с непрерывным возвратом каретки и переводом строки эффект индикатора выполнения заключается в перемещении справа налево;
  • Нам просто нужно изменить на [%-100s]
 printf("[%-100s]\r", bar);

3. Код основной части прогресс бара

#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. Создайте процентную часть прогресса

1. Детали дизайна: «Как представить %»

  • Подробности: поскольку [% + '' буква является типом данных], косая черта [%] представлена ​​​​[%%]

2. Принцип реализации

  • пока цикл
int main()
{
    
    
 int i = 0;
 while(i <= 100 )
 {
    
    
 printf("[%d%%]",i);
 fflush(stdout);
 }
 return 0;
}

3. Создайте вращающуюся часть курсора

1. Детали дизайна: "\ Как изобразить"

  • Подробности: поскольку [\ +'' является escape-символом, косая черта [\] представлена ​​как [\\]

2. Принцип реализации

  • Строка-константа соответствует [ i++% 4 ]
  • [-r Enter] + [значок обновления fflush] Следующий раунд цикла while напрямую перезаписывает исходные символы, чтобы реализовать вращение курсора;
int main()
{
    
    
  int i = 0;
  const char *lable="|/-\\";
  while(i <= 100 )
  {
    
    
    printf("[%c]\r",lable[i++%4]);
    fflush(stdout);
  }
}

4. Полный код индикатора выполнения

#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;
}

Guess you like

Origin blog.csdn.net/YYDsis/article/details/131776415