LINUX.ORG.RU

как обновлять строку без символа новой строки?

 


1

2

Нужно сделать так.

total: 0%
при следующем обновлении на этой же строке
total: 1%
Это мне с stty что-то надо делать, или посмотреть в man 2 ioctl_list? Или выводить так
int n;
for ( int a = 0; a < 100; a++ )
{

 printf ( "total: %d%%%n", a, &n );
 for ( int i = 0; i < n; i++ ) printf ("\b");
}

Ну да, как-то так:

echo "total: 0%\b\b"
# do something
echo "total: 1%\b\b"
Только считай, сколько '\b' нужно при каждом выводе. Или целиком гони до начала строки, как ты и сделал.

anonymous
()

Что-то не понял в чем вопрос?
Печатаем «total: », потом выводим число, фигачим «\b» по кол-ву символов в числе и снова число. Что тут сложного?

erfea ★★★★★
()
$ for i in `seq 100`; do echo -ne "qwe $i\x0d"; sleep 1; done ; echo
sergej ★★★★★
()
Последнее исправление: sergej (всего исправлений: 1)
Ответ на: комментарий от erfea

Ну это один из способов, но при обновлении видно как курсор бегает по строке. А я видел, где при обновлении курсор всегда в конце находится, и я что-то не думаю что там также пишут.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Попробуй за раз писать и «\b» и число, да скидывай буфер каждый раз сразу. Как там это в стандартной либе не помню, в Qt метод flush() у стрима есть.

erfea ★★★★★
()
#include <stdio.h>
#include <unistd.h>

void main(void) {
  for (int a = 0; a < 100; a++) {
    printf("total: %d%%\r", a);
    fflush(stdout);
    usleep(100000);
  }
}

???

samson ★★
()
Последнее исправление: samson (всего исправлений: 1)

или так:

  int n;
  printf ("total: ");
  for (int a = 0; a < 100; a++) {
    printf ("%d%%%n", a, &n );
    for ( int i = 0; i < n; i++ ) printf ("\b");
    fflush(stdout);
    usleep(100000);
  }
  printf("\n");

samson ★★
()

Используй ANSI последовательности для сохранения (\033[s) и восстановления (\033[u) позиции курсора. Для обновления вывода вызывай fflush(stdout).

anonymous
()
Ответ на: комментарий от samson

n = printf ("%d%%", a); как-то более привычно смотрится!

anonymous
()
Ответ на: комментарий от samson

Так как printf() - тормозная функция, то вот малось извратил:

        int a;
        char bb[5] = { '\b', '\0', '\0', '\0', '\0' };

        printf ("total: ");
        for (a = 0; a <= 100; a++) {
                bb[(a/100!=0) + (a/10!=0) + 1] = '\b';
                printf ("%d%%%s", a, bb);
                fflush(stdout);
                usleep(100000);
        }
        printf("\n");

vodz ★★★★★
()
Ответ на: комментарий от vodz

а чем такой код быстрее? типа нет printf(«\b») в цикле?

как по мне - так надо использовать самый короткий, простой и наглядный путь.

  for (int a = 0; a < 100; a++) {
    printf("total: %d%%\r", a);
    fflush(stdout);
    usleep(100000);
  }
И только если действительно необходимо - оптимизировать. Преждевременная оптимизация...

samson ★★
()
Последнее исправление: samson (всего исправлений: 3)
Ответ на: комментарий от samson

Так и баш написан на сях. Можно считать, что это высокоуровневая сишная библиотека.

anonymous
()
Ответ на: комментарий от samson

а чем такой код быстрее? типа нет printf(«\b») в цикле?

Ну да. Не так уж много, что может сравниться по объёму реализации в libc с функцией *printf().

И только если действительно необходимо - оптимизировать. Преждевременная оптимизация...

А оптимизировать может потребоваться много чего. Скажем, если процесс выполнения не 100-шаговый, а с огромным количеством шагов, то выводить каждый раз одно и тоже значение прогресса - тоже очень плохо. Ну и так далее :)

vodz ★★★★★
()
Ответ на: комментарий от vodz

А оптимизировать может потребоваться много чего

про преждевременную оптимизацию не я сказал! Если так каждый раз «оптимизировать», то сами подумайте во что код превратится с ростом количества строк и кучи таких вот различных методов «вот малось извратил»

по теме:

получается самый нормальный ответ от ананимуса

  printf("total: ");
  for (int a = 0; a < 100; a++) {
    printf("\033[s%d%%\033[u", a);
    fflush(stdout);
    usleep(100000);
  }

samson ★★
()
Последнее исправление: samson (всего исправлений: 1)
Ответ на: комментарий от samson

самый нормальный

Привязка к VT100 же (или откуда там эти коды управления были?)

XMs ★★★★★
()
Ответ на: комментарий от vodz

то выводить каждый раз одно и тоже значение прогресса - тоже очень плохо

а вот одно и то же значение действительно не надо, но тут оно и не выводитя)

samson ★★
()
Ответ на: комментарий от samson

короче получается самый нормальный ответ от ананимуса

Это самый неправильный. Так как никто не обещал работу этой ESC-последовательности. Cамый простой метод, но чуть некрасиво, но совсем не раздражает:

int a;
  printf("total: ");
  for (a = 0; a < 100; a++) {
    printf("%3d%%\b\b\b\b",a);
    fflush(stdout);
    usleep(100000);
  }

vodz ★★★★★
()
Ответ на: комментарий от vodz

Это самый неправильный

про ESC-последовательности согласен

samson ★★
()
Ответ на: комментарий от samson

Если я правильно понял вопрос, то должно (если до сброса буфера делать)

XMs ★★★★★
()
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
   setbuf(stdout,NULL);
   for (int i = 0; i < 100; ++i)
   {
       sleep(1);//для наглядности
       printf("total %d\%\r",i );
   };
    return 0;
}

Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 1)

Уже предлагали метод показанный ниже?

$ echo a$'\ch's
nihirash ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.