пропуск символов с помощью printf - PullRequest
1 голос
/ 08 ноября 2011

Я пытаюсь написать программу, которая будет писать на консоли в очень конкретной позиции на экране. Скажем, например, из столбца 20 в столбец 39. После каждой записи строка «сбрасывается» благодаря параметру \r. Это гарантирует, что строка остается статической и обновляются только определенные поля.

Проблема в том, что я могу дать команду printf писать из столбца 0–19 без стирания остальной части строки, но, похоже, я не могу дать команду printf писать из столбца 20 и далее без стирания в столбцах процесса от 0 до 19.

Есть ли (стандартный) способ сделать это? возможно использование чего-то другого, кроме printf.

[Edit] Я читал, что есть функция gotoxy () в C, которая, очевидно, доступна для Windows, и ее можно эмулировать в Linux с помощью ncurses. Есть ли проблемы с этой функцией?

Ответы [ 6 ]

1 голос
/ 08 ноября 2011

У меня были такие же проблемы раньше. Я использовал gotoxy (), когда кодировал в TurboC ++.

Проверьте это. Выглядит хорошо.

http://www.daniweb.com/software-development/c/code/216326#

1 голос
/ 08 ноября 2011

Вы можете попробовать напечатать столько пробелов (и пробелов, чтобы очистить старый текст), сколько необходимо для позиционирования курсора.

Нет гарантии, что он работает для вас ... если это так: нет гарантии, что он работает надругой компьютер:)

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
  int i, k;
  time_t oldtime = time(0);
  if (oldtime == (time_t)-1) {
    fprintf(stderr, "time function does not work on this machine\n");
    exit(EXIT_FAILURE);
  }
  while (time(0) == oldtime) /* void */;

  printf("fixed stuff: ");
  for (i = 1; i < 6; i++) {
    int val = pow(10, i) * i;
    printf("%d", val);
    fflush(stdout);
    oldtime = time(0);
    while (time(0) == oldtime) /* void */;
    if (i < 5) {
      for (k = 0; k < i + 1; k++) printf("\b \b"); // go back; erase; go back again
      fflush(stdout);
    } else {
      puts("");
    }
  }

  return 0;
}

Это работает для меня как на компьютерах Linux, так и на Windows

1 голос
/ 08 ноября 2011

Согласно документации ANSI , вы можете использовать "\033[1;20H" для позиционирования курсора.

Переместит курсор в нужную позицию. Значения 1 и 20 - это строка и столбец, просто измените его, чтобы правильно расположить отпечаток.

Или вы можете попытаться с помощью "\033[20C" переместить курсор в столбец 20.

1 голос
/ 08 ноября 2011

AFAIK нет стандартного способа сделать это, потому что нет стандартизации поведения консоли (например, консоль Windows не ведет себя как Linux)

0 голосов
/ 09 ноября 2011

Марк Рочкинд написал действительно хорошую книгу, которая является ведущим справочником по этому вопросу! Расширенное программирование на С для дисплеев: символьные дисплеи, Windows и клавиатуры для операционных систем Unix и MS-DOS

0 голосов
/ 08 ноября 2011

Почему бы вам не просто sprintf (myStr, .... и построить строку в памяти, а затем вывести ее за один раз? Вы можете оставить нужные поля в предыдущем обновлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...