Позиция курсора - кросс-платформенное решение

Тема в разделе "WASM.ZEN", создана пользователем volodya, 29 мар 2005.

  1. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Многие из вас помнят команду format. Вот даешь ей задание, скажем, format C: и наблюдаешь за тем, как ползут проценты. Причем, заметьте, проценты отображаются строго на одной и той же позиции. Достичь такого возможно, устанавливая позицию курсора, печатая число, восстанавливая позицию курсора после всего. Однако, как выставить позицию курсора в общем, кросс-платформенном варианте - я не знаю :dntknw:



    Для консоли Win32 - нет проблем, там есть специальная функция.

    Для С CRT, по логике, подошли бы fgetpos, fsetpos, т.е. нечто вида



    fgetpos(stderr, &pos)



    однако, функции возвращают мне сообщение об invalid file descriptor...



    что делать еще - я уже не знаю :dntknw:



    порылся в гугле - надыбал нечто вида



    http://mail.gnome.org/archives/mc-devel/2003-February/msg00174.html



    с забавным макросом:


    Код (Text):
    1.  
    2. #define cursor_to(x, y) do {                \
    3.     printf("\x1B[%d;%df", (y) + 1, (x) + 1);    \
    4.     fflush(stdout);                 \
    5. } while (0)
    6.  




    Смысл понимаю не шибко - какие-то управляющие коды :dntknw: Хак...



    Словом, кто-то может предложить кросс-платформенное решение для проблемы?
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Гы-гы, и нифига этот макрос не работает :dntknw:(((
     
  3. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Или, если в общем случае это не решаемо, мне бы хоть под соляру... :dntknw:
     
  4. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    хм

    а

    printf("Current progress: %02d%\r", progressPercent);

    внутри цикла уже не модно ?

    ну ессно после завершения printf("\n");
     
  5. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    нет, не модно.

    во-первых, такое сожрет до хрена места на экране и сожрет его по глупому, во-вторых, в моем случае я не могу посчитать проценты, т.к. я наперед не знаю, сколько строчек в файле я встречу.
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    volodya

    Если %% можно отображать в последней строке то можно сделать так:
    Код (Text):
    1. for(int i=0;i<=100;i++)
    2.   printf("\rformat %c:, %3d%% complete ...",'C',i);
    Иными словами выводить всю строку заново вернув курсор в её начало.
     
  7. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    ПОНЯЛ!!!

    БАЛДА Я ИВАНОВНА!

    Кстати, не знал об \r!
     
  8. Funbit

    Funbit Member

    Публикаций:
    0
    Регистрация:
    13 апр 2003
    Сообщения:
    92
    Адрес:
    Russia
    управляющие коды можно посмотреть, скажем вот здесь:

    http://www.ascii.cl/control-characters.htm



    скажем, чтобы печатать проценты в одном и том же месте,

    достаточно в цикле выводить 2 символа: "00"-"99" и после

    добавлять 2 управляющих кода с кодом 8 :)

    т.е.:
    Код (Text):
    1. printf ("%02i\x08\x08", iPercent);


    для кода 8 есть и escape готовая: "\b"..



    для остальных надо читать, но сам принцип думаю понятен
     
  9. ava

    ava New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2003
    Сообщения:
    169
    volodya, "неработающий" макрос - это одна из ANSI-шных ESC-последовательностей. Макрос работает, например, в DOS-е, если установлен драйвер ansi.sys.
     
  10. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    И это я уже понял :) Но идея с \r куда веселее :)