Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2013, 03:55   #1
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
Вопрос красивый интерфейс на псевдографике

Доброго времени суток.
Появилась потребность написать интерфейс в консоли, в ходе которой я столкнулся с некоторыми проблемами.
Вот что я хочу сделать:

символьная рамочка(задается 4-мя цифрами),
а внутри нее выводятся разные данные, например что-нибудь такое вот:
(не знаю почему рамочка поганится здесь, на форуме, вообще она прямоугольная
Код:
-----------------------
| ххх:    фффф           |
| аа = 55                   |
| exit = false              |
-----------------------
при этом требуется:
1)если я подаю ему слишком длинные данные, он их обрезает.
2)данные нужно переодически обновлять (выборочно)

теперь что есть:
функция для рамочки)
класс для "окошка", состоящий пока только из координат курсора в консоли(т.е. можно считать, вообще не реализован)
класс для данных, которые нужно обновлять, тоже состоит из координат курсора для этих данных + функция обновления. чтобы было ясней:
Код:
mainInterface.update(status); // и пусть он перерисует exit c false на true
и проблемы:
-как реализовать контроль длины вывода?
----знаю есть манипулятор width(), но он контролирует только в большую сторону
----можно ли как то положить сначала все в буфер а потом выводить
----только, скажем, 15 символов (имеются ввиду встроенные средства)?
--------можно, конечно, завести char *buf какой-нибудь
--------и в него все складировать, а затем выводить но,
--------во-первых может это уже сделано в глубинах ostream?,
--------а во-вторых: нужна конвертация из всех типов в char (числа тоже надо выводить, да и мало ли что еще...),
--------и код будет похож непонятно на что, а хочется все-таки что бы он напоминал
Код:
cout << _str << " / " << _num << endl;
собственно хотел написать еще, проблем-то хватает, но и так получилось больше чем думал, ограничимся пока этим вопросом)

если вы считаете этот метод ужасным/тупиковым/бесперспективным предложите другой вариант реализации интерфейса (не графический конечно же) буду только рад это исключительно мое представление)
denrubun вне форума Ответить с цитированием
Старый 12.02.2013, 08:04   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Как вариант - используйте вместо пробелов табуляцию. Если данные будут по длинне будут отличаться на пару символов, то все будет ок.

А так... перед выводом приводите все к строке и в зависимости от длинны строки добавляйте пробелы или обрезайте строку.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 12.02.2013, 09:55   #3
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

Цитата:
перед выводом приводите все к строке
вот я собственно и спрашивал: как это сделать? если не ошибаюсь ostream приводит все к строке, как бы мне эти его функции заюзать?
denrubun вне форума Ответить с цитированием
Старый 12.02.2013, 10:21   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

через поток... не могу сказать, не пользовался ими для таких целей.
Я в таком случае писал себе функцию itoa (она в некоторых компиляторах бывает, но стандартом она не требуется, следовательно ее отсутствие - нормальное явление).
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 12.02.2013, 10:50   #5
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

ну тогда вопрос: можно ли положить в буфер данные, но не выводить их?
для входных данных буфер замечательно работает, а вот чтобы для выходных - ни разу не встречал...
denrubun вне форума Ответить с цитированием
Старый 12.02.2013, 11:49   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Если не ошибаюсь, std::strstream это то, что вам надо
waleri вне форума Ответить с цитированием
Старый 12.02.2013, 12:46   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Не понял идею.

Допустим у нас в консоль выводятся значения трёх счётчиков. Эти значения увеличиваются в реальном времени (пусть с разной скоростью). Окошко консоли обновляется.

Код:
----------------
| counter1 = 0 |
|              |
| counter2 = 0 |
|              |
| counter3 = 0 |
----------------
Один из вариантов - сделать таблицу максимальной и фиксированной ширины, учитывая, что максимальное значение счётчика нам известно.

Код:
------------------------
| counter1 = 334738471 |
|                      |
| counter2 =    338471 |
|                      |
| counter3 =       471 |
------------------------
А если вы будите обрезать, то данные будут некорректны.

Делайте таблицу максимальной и фиксированной ширины, или увеличивайте ширину таблицы (опять же до определённого максимального значения). Проверяйте длину выходных данных, если данные не умещаются в таблицу, то выводите соответствующее сообщение об ошибке (и эти данные), например, на экран консоли под таблицей.

Считаю, что обрезать выходные данные - неправильно.
8Observer8 вне форума Ответить с цитированием
Старый 12.02.2013, 15:13   #8
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

таблица фиксированной ширины, расширять пока не собирался, но может и надумаю.
насчет обрезания: как лучше?
так
Код:
//v1 = 122333
-----------
| v1 = 122|
| v2 = 1  |
-----------
или так?
-----------
| v1 = 122333
| v2 = 1  |
-----------
мне лично второе совсем не нравится, хотя бы тем что оно может залезть на место каких то других записей
к тому же если строка обрезана, можно закончить ее многоточием, и тут уже не скажешь что данные не правильные

насчет ошибок: по-моему не стоит акцентировать внимание пользователя на том, что у вас не влезла строка и кидать еррор, т.к. как таковая ошибка отсутствует, рассчеты будут проведены правильно, некорректен только вывод
denrubun вне форума Ответить с цитированием
Старый 12.02.2013, 15:54   #9
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

Код:
Если не ошибаюсь, std::strstream это то, что вам надо
спасибо огромное, так и сделал!
denrubun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пошаговый псевдо-3d шутер в псевдографике #include <Markus> Gamedev - cоздание игр: Unity, OpenGL, DirectX 49 20.06.2016 01:32
[С++] Cоздание таблиц в псевдографике SadSad13 Помощь студентам 2 17.10.2011 03:54
Красивый интерфейс в Qt savva-paladin Qt и кроссплатформенное программирование С/С++ 5 05.12.2010 09:11
Компоненты. Красивый интерфейс GenniY Компоненты Delphi 3 13.10.2009 11:56
красивый интерфейс проги jkpro Общие вопросы Delphi 4 04.10.2009 18:24