Страницы

Поиск по вопросам

Показаны сообщения с ярлыком консоль. Показать все сообщения
Показаны сообщения с ярлыком консоль. Показать все сообщения

суббота, 11 апреля 2020 г.

Не работают некоторые сочетания клавиш в консоли FreeBSD

#консоль #shell #freebsd

                    
Я зашёл по ssh на сервер, на котором установлена ОС FreeBSD (например, на хостинге
nic.ru установлена FreeBSD 8.1), и при работе в консоли обнаружил, что некоторые привычные
сочетания клавиш (например, ctrl+стрелка вправо/влево для "перепрыгивания" между словами)
не работают. Вместо ожидаемого действия я получаю в консоль мусорный вывод такого вида:

;5D;5D;5C;5C~~


Как заставить работать сочетания клавиш, которые не работают в консоли FreeBSD "из
коробки"?
    


Ответы

Ответ 1



Дело в ненастроенном readline(3). "Мусор", который видно в терминале - это коды нажатия клавиш и их сочетаний, которым не присвоены никакие функции (чтобы увидеть коды для сочетаний клавиш, которым функции присвоены, можно нажать Ctrl+V и потом интересующее сочетание клавиш (или единичную клавишу) - для кнопки Enter, например, код будет ^M - то есть вместо Enter в консоли можно нажимать Ctrl+M с тем же эффектом, сюрприз!). Уже назначенные на разные клавиши и их сочетания функции можно посмотреть командой bind -lpvs. Для sh и bash настройки readline можно задать в файле .inputrc в домашней папке пользователя. Для реализации неработающих из коробки в FreeBSD сочетаний клавиш я использую следующие настройки: # ~/.inputrc: readline initialization file. # (you can view all current assignments by runnig `bind -lpvs`) # let Insert, PageUP, PageDown keys work properly in bash under FreeBSD and Linux: "\e[2~": overwrite-mode "\e[5~": beginning-of-history "\e[6~": end-of-history # let Ctrl-left-arrow and Ctrl-right-arrow jump over words: "\e[1;5C": forward-word "\eOC": forward-word "\e[1;5D": backward-word "\eOD": backward-word Стоит отметить, что код сочетания клавиш, который можно прочесть с помощью Ctrl+V, может отличаться для разных видов терминалов - например, не совпадать в "обычном" терминале и внутри screen. Вы можете самостоятельно расширить предлагаемый ~/.inputrc для таких случаев.

четверг, 9 апреля 2020 г.

Java автодополнение в консоли используя статистику списка слов

#java #сортировка #поиск #консоль

                    
Цель - создание консольного Линукс/Win приложения с автодополнением текста используя
файл статистики слов. 

Пример файла статистики:

бумага 223
утро 114
утюг 513
уран 22
тепло 144


Всего около 100000+ слов

Какой наилучший алгоритм для поиска и как лучше отсортировать считанные с файла слова
с их статистикой?

Я думаю записать слова для каждой первой буквы в отдельный список List типа ключ-значение
(SortedMap-TreeMap?) с сортировкой по значению, и разместить те списки в ArrayList.
Когда пользователь начинает писать слово, список с его соответственный его первой букве
сканируется на подходящие слова и они выдаются с сортировкой по значению. Это хороший
способ? как практически лучше это написать, используя что из коллекций и какой алгоритм?
    


Ответы

Ответ 1



Собственно есть два быстрых пути. Можно реализовать, перенеся твой справочник в таблицу БД create table dictonary (word Varchar(30) primary key, cost integer not null) Тогда поиск будет сводиться к select word from dictonary where word like 'начало_твоего_слова%' order by cost desc Встроенные базы довольно шустрые (H2, HSQLDB) Но если тебе надо использовать только java, то используй TreeMap. Только для начала оговоримся, что все твои слова должны содержать только русские буквы (привет кэп), и желательно только нижнего регистра. Далее остается использовать метод subMap, но с одной хитростью. Если ты ищешь слова начинающиеся с бу, то тебе надо передавать параметры в submap в виде бу\u040f (в конце символ, код которого меньше кода первой буквы алфавита) и бу\u0450 (в конце символ, код которого больше кода последней буквы алфавита). Хитрость, но работает. Плюс тебе придётся сортировать результат, согласно статистике повторений слова.

воскресенье, 29 марта 2020 г.

Создание кнопки в консоли на C#

#c_sharp #консоль


Возможно ли добавить в консольное приложение кнопку? Чтобы пользователь не вводил
сообщение сам, а нажимал на слово и получал результат. Своеобразный гипертекст для консоли.
    


Ответы

Ответ 1



Можно сделать что-то такое: Console.WriteLine("Choose your destiny:"); int top = Console.CursorTop; int y = top; Console.WriteLine("One"); Console.WriteLine("Two"); Console.WriteLine("Three"); int down = Console.CursorTop; Console.CursorSize = 100; Console.CursorTop = top; ConsoleKey key; while ((key = Console.ReadKey(true).Key) != ConsoleKey.Enter) { if (key == ConsoleKey.UpArrow) { if (y > top) { y--; Console.CursorTop = y; } } else if (key == ConsoleKey.DownArrow) { if (y < down - 1) { y++; Console.CursorTop = y; } } } Console.CursorTop = down; if (y == top) Console.WriteLine("один"); else if (y == top + 1) Console.WriteLine("два"); else if (y == top + 2) Console.WriteLine("три"); Пользователю выводится список, по которому он может перемещаться, нажимая клавиши вверх и вниз. После чего сделать выбор, нажав Enter. При желании, можно добавить в консольное приложение графическое окошко. Но лучше так не делать, а сразу создавать оконное приложение. Добавьте в проект ссылку на сборку System.Windows.Forms.dll. После чего можно сваять следующее: var list = new List { "one", "two", "three" }; var form = new Form(); var listBox = new ListBox { Parent = form }; listBox.DataSource = list; var button = new Button { Parent = form, Text = "OK", Left = 200, Top = 230, DialogResult = DialogResult.OK }; form.AcceptButton = button; form.ShowDialog(); var value = (string)listBox.SelectedValue; Console.WriteLine(value); Тут всё просто: создали форму, на неё поместили листбокс, к нему привязали список с нужными значениями. Также на форму помещаем кнопку и настраиваем необходимые свойства так, чтобы нажатие клавиши Ввод (Enter) закрывало форму. После закрытия окна получаем из листбокса выбранный пункт.

суббота, 21 марта 2020 г.

Открыть из консоли вкладку с терминалом и вкладку с файлом в Vim 8

#консоль #vim


В Vim 8 добавили терминал, который вызывается командой :terminal. Вопрос: как из
командной строки вызвать vim, чтобы в первой вкладке сразу открылся терминал, а во
второй — файл? Что-то типа такого (не работает):

$ vim -p :terminal readme.txt

    


Ответы

Ответ 1



vim -c ':tab terminal' -c 'tabm 0' -p readme.txt После загрузки буфера, выполняется открытие новой вкладки с терминалом, перемещение текущей вкладки в начало. vim -c ':tab terminal' -c 'tabm 0' -c ':tabn' -p readme.txt Покажет содержимое файла, после загрузки.

воскресенье, 8 марта 2020 г.

Как задать размер окна консольного приложения C++ в Linux?

#cpp #linux #консоль


Здравствуйте. Захотел написать консольную игрушку на С++. Первым делом решил установить
размеры окна консоли. Google сразу пришел на помощь, но проблема в том что все рецепты
используют библиотеку windows.h, а на моей машине стоит Ubuntu 16.04. Буду признателен
за помощь.
    


Ответы

Ответ 1



Редкая задачка. К счастью, еще разработчики xterm, наряду с реализацией огромного количества управляющих последовательностей (Control Sequences) типичных для распространенных текстовых терминалов (управление курсором, цветом, набором символов, вставкой, удалением и сдвигом текста и т.д. и т.п.), подумали об аналогичных последовательностях для перемещения окна эмулятора и изменении его размера на экране оконной системы X-windows (в приведенной выше ссылке их можно найти поиском по тексту Window manipulation). Для изменения размера окна в символах используется последовательность: ESC [ 8; height; width; t Где ESC -- это символ с кодом 033 (восьмеричный) 27 (десятичный) или "\e" в строке. Вообще, в том же документе для последовательность символов ESC [ используется термин CSI (Control Sequince Introducer) (другие часто встречающиеся в управлении терминалом последовательности -- DCS ESC P (Device Control String), OSC ESC ] (Operating System Command) и ST ESC \ (String Terminator)). Маленькая демо программа на C/C++ #include #include #define COLS 24 #define ROWS 80 int main (int ac, char *av[]) { int cols = av[1] ? atoi(av[1]) : COLS, rows = av[1] && av[2] ? atoi(av[2]) : ROWS; if (cols < 0) cols = COLS; if (rows < 0) rows = ROWS; printf("\e[8;%d;%d;t", cols, rows); return fflush(stdout) == EOF; } Хотя в документе написано, что если width или height (ширина и высота (количество строк)) опущены, то используется их текущее значение, а если равны нулю, то берутся некоторые значения по умолчанию (display's height or width), но в моих экспериментах с bash-скриптом resize.sh #!/bin/bash printf "\e[8;$1;$2;t" в обеих случаях окно менялось на стандартный размер 24 х 80 символов. В Ubuntu 16.04.1 LTS изменение размера окна работает по крайней мере в терминалах gnome-terminal и xfce4-terminal (а вот в xterm версии XTerm(322) ничего не меняется(!!!)).

пятница, 28 февраля 2020 г.

Скрыть консоль без использования FreeConsole()

#cpp #windows #консоль


Есть ли возможность как-то по другому скрыть консоль?
    


Ответы

Ответ 1



Ну для начала вы можете и не создавать консоль используя только функцию winmain В случае если у вас Visual Studio, в настройках линковки Project->Properties->Linker->System->Subsystem указываете подсистему Windows (/SUBSYSTEM:WINDOWS). Консоль исчезла, а нагрузка будет минимальная.

Ответ 2



Если нужно временно скрыть или отобразить консоль, можно использовать следующие функции: #include void HideConsole() { ::ShowWindow(::GetConsoleWindow(), SW_HIDE); } void ShowConsole() { ::ShowWindow(::GetConsoleWindow(), SW_SHOW); } Источник: C++ How do I hide a console window on startup? - ответ nikau6

пятница, 14 февраля 2020 г.

C++ (VS). Мини-игра в консоли

#cpp #c #консоль


Необходимо реализовать в консоли мини игру, типа арканоида, змейки.
Опыта мало, я решил обновлять картинку в консоли следующим образом :
   1. system("cls");
   2. выводим в консоль новую картинку.
Проблема такая - при обновлении картинки происходит мелькание заново отрисовываемых
символов.
Какими путями можно избавиться от  такого , чтобы в консоли картинка обновлялась
наименее заметно для человеческого глаза
    


Ответы

Ответ 1



Можно делать буферизованный вывод на экран, примерно так #include #include #include #include void move(int & dir, ::std::size_t & pos, ::std::size_t max) { switch(rand() % 20) { case 0: dir = 0; return; case 5: dir = -1; break; case 10: dir = 1; break; case 15: dir *= -1; break; } if(0 < dir) { if((max - 1) == pos) pos = 0; else pos += 1; } else if(dir < 0) { if(0 == pos) pos = max - 1; else pos -= 1; } } int wmain(int argc, wchar_t **argv) { constexpr ::std::size_t const width{80}; constexpr ::std::size_t const height{30}; ::std::array buf{}; for(::std::size_t char_index{}; buf.size() != char_index; ++char_index) { buf[char_index] = (0 != ((char_index + 1) % width)) ? L' ' : L'\n'; } ::std::size_t col_pos{}; ::std::size_t row_pos{}; int x_dir{}; int y_dir{}; ::std::array<::std::size_t, 42> tail{}; ::std::size_t cur_tail_end_index{}; ::HANDLE const output{::GetStdHandle(STD_OUTPUT_HANDLE)}; ::CONSOLE_CURSOR_INFO cursor_info{sizeof(cursor_info), FALSE}; // hide cursor ::SetConsoleCursorInfo(output, ::std::addressof(cursor_info)); for(;;) { buf[tail[cur_tail_end_index]] = L'·'; ++cur_tail_end_index; cur_tail_end_index %= tail.size(); buf[tail[cur_tail_end_index]] = L' '; ::move(x_dir, col_pos, width - 1); ::move(y_dir, row_pos, height); tail[cur_tail_end_index] = width * row_pos + col_pos; buf[tail[cur_tail_end_index]] = L'O'; ::SetConsoleCursorPosition(output, {}); ::WriteConsoleW(output, buf.data(), buf.size() - 1, {}, {}); ::Sleep(1000 / 60); } } Примерный вывод:

Ответ 2



pdcurses - это порт ncurses на windows работает так: https://youtu.be/Kcv84FVszkc

Ответ 3



Можно попробовать заменить while (true){ // здесь основной цикл просчётов system(cls); draw(); } на while (true){ // здесь основной цикл просчётов system(cls); draw(); sleep(150); // спим 150 миллисекунд } Иногда игра очень простая и просчёты очень быстрые, а как следствие рисовать дольше чем просчитывать. В общем попробуйте просто добавить слип. Может помочь!

Ответ 4



int main() { HANDLE hCon; COORD cPos; hCon = GetStdHandle(STD_OUTPUT_HANDLE); cPos.X = 0 ; cPos.Y =0; Setub(); while (gameover != true) { SetConsoleCursorPosition(hCon, cPos); Draw(); Input(); Logic(); Sleep(100); } }

воскресенье, 9 февраля 2020 г.

Linux/*NIX и аргументы программы

#linux #bash #консоль #freebsd


Интересует вопрос, каким образом работают аргументы программы на разных ОС (Debian/Linux,
FreeBSD, Solaris, etc).

Для примера, возьмём стандартную программу  ls, и запустим её с аргументами -a -l.
Получим вывод. Однако, запустив ls -la, ls -al, ls -l -a - мы получим тот же вывод.
Хотелось бы узнать - данное поведение как-то контролируется разработчиками? Например,
я напишу программу, которая будет работать со следующими аргументами: -R -t -dT, как
юзер сможет запустить программу, как показано на примере ls? Это 'регулируется' автором
тулзы?
    


Ответы

Ответ 1



Это 'регулируется' автором тулзы? И да и нет. Программист сознательно должен предусмотреть это в своей программе, но для этого есть стандартная библиотечная функция — getopt() и встроенная команда оболочки getopts. Обе они стандартизированы POSIX. Интерфейсы к getopt есть практически во всех языках. Например, я напишу программу, которая будет работать со следующими аргументами: -R -t -dT, Подразумевая, что это -d и -T — это два разных ключа, на Си типовой пример обработки будет выглядеть примерно так: #include #include #include void usage(const char* name) { printf(stderr, "Usage: %s" -[RtdT] [-f ], name); } int main (int argc, char **argv){ bool recursive=0; bool show_directory=0 bool super_time=0; char *file; int c; while ((c = getopt (argc, argv, "RtdTf:")) != -1) { switch (c) { case 'R': recursive = 1; break; case 't': process_time = 1; break; case 'd': show_directorye = 1; break; case 'T': process_time = 0; break; case 'f': file = optarg break; case 'h': usage(argv[0]); return EXIT_SUCCESS; case '?': return EXIT_FAILURE; default: assert(0); } } // do stuff return EXIT_SUCCESS; } glibc также предоставляет функцию getopt_long (), которая поддерживает парсинг длинных аргументов вида --some-option и --some-option-with-arg=val, но это только расширение GNU. Для примера, возьмём стандартную программу ls, и запустим её с аргументами -a -l. Получим вывод. Такое поведение большинства утилит, кстати также стандартизовано POSIX.

среда, 5 февраля 2020 г.

Как разбить введенные пользователем числа пробелами?

#c_sharp #консоль


Допустим, пользователь вводит в консоль ряд некоторых чисел. Как сделать, чтобы ему
нужно было вводить их через пробел, и каждое из чисел считывалось как отдельное? Например
я ввожу: "6 0 73 15", нажимаю enter, и далее мне нужно с этим набором чисел произвести
некоторые действия.
    


Ответы

Ответ 1



Попробуйте так var numbers = Console.ReadLine() .Split(new[] {" "},StringSplitOptions.RemoveEmptyEntries) .Select(Int32.Parse); foreach(var n in numbers) Console.WriteLine(n); Давайте рассмотрим, что происходит: Console.ReadLine() - считывает всю строку с пробелами, что ввел юзер .Split(new[] {" "},StringSplitOptions.RemoveEmptyEntries) - разбивает считанную строку на несколько строк, используя пробел как сепаратор. То есть была строка "45 67", стало 2 строки "45", "67" .Select(Int32.Parse); - конвертирует набор строк в набор чисел. То есть были 2 строки "45", "67", стало 2 числа 45, 67 В итоге в numbers будет находится объект - перечисление чисел, которые ввел пользователь. Дальше по коду я перечисляю этот объект, чтобы вывести в консоль. foreach(var n in numbers) Console.WriteLine(n);

Ответ 2



Можно и без Linq: int[] numbers = Array.ConvertAll(Console.ReadLine().Split(), int.Parse); Т.е. считываем строку с консоли Console.ReadLine(), потом методом Split() получаем из этой строки массив, при этом при отсутствии параметров в качестве разделителей будут приняты все пробельные символы. Затем метод Array.ConvertAll применяет ко всем элементам входного массива функцию, переданную вторым параметром (int.Parse), таким образом, из массива строк получается массив int

Построение пирамиды в консоли

#c #консоль


Здравствуйте!

Помогите решить задачу (из книжки), написать нужно на СИ.


Я смог только составить 2 цикла, которая печатает буквы:

ch = ch1 = ch2;  //Буква, которую ввёл пользователь

for ( ch; ch >= 'A'; ch--) // в порядке убывания
{
    printf("%c", ch);
}

for ( i = 'A'; i <= ch1; i++) //в порядке возрастания
{
    printf("%c", i);
}


Решение данной задачи я так же нагуглил, но совершенно не понял.
Объясните, пожалуйста, как это реализовать. Спасибо.
    


Ответы

Ответ 1



Давайте разобьём задачу на части, будет всё просто. У нас есть k строк. Чтобы напечатать их, надо, понятно, цикл по номеру строки от 0 до k - 1. Хорошо. Что должно быть в i-ой строке? Для начала, в строке есть несколько пробелов. Сколько? В последней строке (её номер k-1) 0 штук, в предпоследней (её номер k-2) один, и так далее. Значит, в i-ой строке у нас k - 1 - i пробелов в начале. Есть? Затем, там идут буквы от A по возрастанию. Сколько их в i-ой строке? В 0-й одна, в 1-ой две и т. д. То есть, i + 1 штук. Таким образом, нам нужен внутренний цикл от 0 до i, в котором мы выдаём новую букву. Видите? Затем, начиная от последней буквы вниз до A выдаём их в обратном порядке. Подумайте, как это можно сделать. В конце строки не забывайте \n.

Ответ 2



У меня такой код получился. #include #include #include int main () { char ch = getch(); printf("%c\n", ch); if (ch < 'A' || ch > 'X') { printf("Error input char\n"); exit(1); } int lines = ch - 'A' + 1; int rcount; for (int i = 1; i <= lines; i++) { for (int x = 0; x < lines - i; x++) { printf("%c", ' '); } for(int s = 0; s < i; s++) { printf("%c", 'A' + s); rcount = s; } for(int d = rcount, c = 1; d > 0; d--, c++) { printf("%c", 'A' + rcount - c); } printf("\n"); } system("pause"); return 0; } А как объяснение кода попробуйте использовать ответ @VladD но с небольшими изменениями. P.S. Ну если нельзя в С определять переменные в середине кода, а нужно тока в начале, то код получится таким. #include #include #include int main () { char ch = getch(); int i, x, s, d, c, rcount; int lines; printf("%c\n", ch); if (ch < 'A' || ch > 'X') { printf("Error input char\n"); exit(1); } lines = ch - 'A' + 1; for (i = 1; i <= lines; i++) { for (x = 0; x < lines - i; x++) { printf("%c", ' '); } for(s = 0; s < i; s++) { printf("%c", 'A' + s); } rcount = s - 1; for(d = rcount, c = 1; d > 0; d--, c++) { printf("%c", 'A' + rcount - c); } printf("\n"); } getch(); return 0; }

воскресенье, 26 января 2020 г.

Почему консоль пикает? [закрыт]

#c_sharp #консоль #текст


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
static void Main(string[] args)
{
    byte[] data = new byte[] { 8, 8, 3, 8, 5, 6, 7, 8 };
    Console.WriteLine(Encoding.UTF8.GetString(data));
    Console.ReadLine();
}


С чего бы это?
    


Ответы

Ответ 1



И правда, с чего бы ей пикать при выводе символа с кодом 7 - BEL (Bell, он же звонок)?

пятница, 24 января 2020 г.

Как заблокировать пользователю доступ к свойствам консоли?

#cpp #winapi #консоль #окно


Пишу консольное приложение на C++.

Программно убрал возможность выделения области курсором мыши, но обнаружил, что,
перейдя в свойства консоли (правой кнопкой по системному меню окна -> Свойства), можно
снова включить выделение. Мне нужно, чтобы никто не мог этого сделать.
Может быть, можно вообще как-то спрятать системное меню или хотя бы как-то заблокировать
раздел меню "Свойства"?

Кроме выделения, в свойствах есть и другие опции, которые можно изменить. Хотелось
бы этого избежать.


    


Ответы

Ответ 1



Так как "Свойства" - последний элемент в системном меню, можно убрать его с помощью вот такого кода: HWND hWnd = GetConsoleWindow(); HMENU hMenu = GetSystemMenu(hWnd, false); int c = GetMenuItemCount(hMenu); DeleteMenu(hMenu, c-1, MF_BYPOSITION);

среда, 22 января 2020 г.

Что означают такие понятия как: консоль, терминал, эмулятор терминала?

#консоль #эмулятор #терминал


Никак не могу чётко осознать структуру взаимосвязей между этими понятиями, поэтому
прошу упор в ответе делать не на свойства, а сразу на суть вещей.
    


Ответы

Ответ 1



Терминал - это устройство, при помощи которого человеки взаимодействуют с компьютером. Например, через банковский терминал можно взаимодействовать с банковским компьютером. Эмулятор терминала - это программа, которая выдаёт себя за терминал, но на деле им не является. Она может отличаться от настоящего терминала интерфейсом, архитектурой, функционалом, чем угодно. Главное, что компьютер считает её терминалом. Консолями называют обобщённо терминалы и их эмуляторы.

Вывод данных в консоль, с ее очисткой

#java #консоль #обновление


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

boolean[][] dots = new boolean[5][5];

    Random randomBoolean = new Random();

    //Now i want to create a table with random boolean values
    //Eternal loop
    for (;;) {
        try {
            Thread.sleep(500);
            for (int i = 0; i < 5; i++)
            {

                for (int j = 0; j < 5; j++)
                    {
                    dots[i][j] = randomBoolean.nextBoolean();
                    System.out.print(dots[i][j] + "\t");
                    }
                    //Close the column
                System.out.println();
            }
           System.out.println();
        }
        catch (InterruptedException e)
        {
        }

    }


Что и куда мне нужно для этого добавить? 
Спасибо
    


Ответы

Ответ 1



Сама Java очищать консоль не умеет. Но есть небольшая библиотечка, позволяющая отправлять управляющие последовательности в любую ANSI-совместимую консоль - Jansi: import java.util.Random; import org.fusesource.jansi.AnsiConsole; public class Main { public static void main(String[] args) { AnsiConsole.systemInstall(); Random randomBoolean = new Random(); for (;;) { System.out.print("\u001b[2J"); System.out.flush(); try { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.print(randomBoolean.nextBoolean() + "\t"); } System.out.println(); } System.out.println(); Thread.sleep(500); } catch (InterruptedException e) {} } } }

суббота, 11 января 2020 г.

Как убрать консольное окно при использовании функции System?

#cpp #c #консоль #fortran


Добрый день, уважаемые пользователи форума!

В Fortran-е, как и в C, есть функция System, которая передает команду командной строке,
при этом на экране на мгновение появляется консольное окно (Сама программа работает
без использования консоли - заранее прописано:
 #pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") ).

Собственно, вопрос в том, можно ли как-нибудь предотвратить появление этой консоли
при использовании функции System?

Заранее благодарю за ответы!
    


Ответы

Ответ 1



Не используйте функцию system. Используйте popen или CreateProcess, или другую функцию, которая предоставит создаваемому процессу поток вывода, так что ОС не придется создавать консоль для этого процесса.

пятница, 10 января 2020 г.

Форматирование вывода данных в консоли

#c_sharp #console #консоль




Как красиво вывести числа в несколько столбцов, чтобы они не скакали?

Код:

for (int i = 0; i < 1000; i++)
{
    if (i % 3 == 0 || i % 5 == 0)
    {
        Console.Write(i + "  |  ");
        sum += i;
    }
}

    


Ответы

Ответ 1



Попробуйте следующий код: int sum = 0; int count = 0; for (int i = 0; i < 1000; i++) { if (i % 3 == 0 || i % 5 == 0) { Console.Write("{0, 7} | ", i); sum += i; count++; if (count == 8) { count = 0; Console.WriteLine(); } } } Обратите внимание на следующее: Для выравнивания выдачи чисел используется строка формата {0, 7}. Подробнее: MSDN Для сохранения столбцов от строки к строке, после каждых 8 чисел выдается перевод строки: Console.WriteLine().

Вывод в консоль Fortran 66 (IV)

#консоль #fortran


1) Дайте пример кода, чтобы вывести сообщение в консоль по спецификации Fortran 66,
не сохраняя в переменных строку, а сразу оператор вывода со строкой.
Пример на языке С#: 

Console.WriteLine("Программист Программисту Программист");


2) Подскажите параметры чтения, чтобы не закрывал консоль, а ждал ввода любого символа
обязательно Fortran66 он же FortranIV.
пример на языке С#:

Console.ReadKey();


Спасибо. 
Работает!Но не забывайте, что там без наворотов доступно ток латиница А-Z       
                                                                       

program second

WRITE(*,10)
10    FORMAT('Программист Программисту Программист')
READ(*,20) 
20 FORMAT(//) 
end program second   

    


Ответы

Ответ 1



Как-то так: WRITE(*,10) 10 FORMAT('Программист Программисту Программист')

понедельник, 6 января 2020 г.

Ровная таблица в консоли

#c_sharp #console #консоль


Требуется вывести в консоли ровную таблицу.
В данный момент решил это с помощью:

Console.Write("{0, -20}|", text);


Этим кодом я задал минимальное количество символов в столбце, но если символов будет
>20 - всё сломается.
Как обрезать вывод, если строка больше 20-ти символов?
    


Ответы

Ответ 1



В два приёма, разумеется. Собрать все строки вывода, выяснить максимальную длину. На основе максимальной длины сформировать форматную строку. Выводить через неё. В вашем случае вместо вывода у вас будет var column1 = new List(); column1.Add(text); А когда все строки будут добавлены, то var maxWidth = column1.Max(s => s.Length); var formatString = string.Format("{{0, -{0}}}|", maxWidth); foreach (var s in column1) { Console.Write(formatString, s); // тут наверное остальные колонки Console.WriteLine(); }

Ответ 2



Можно написать вспомогательный метод-расширения: public static class StringHelper { public static string Shorten(this string str, int value) { return value > 3 && str.Length > value ? str.Substring(0, value - 3) + "..." : str; } } который будет добавлять многоточие, если длина строки больше, чем value. Пример использования: Console.Write("{0, -20} ", text.Shorten(20));

Ответ 3



Решил проблему таким образом: if (element.Value.Length >= 20) { Console.Write("{0, -20}|", element.Value.Substring(0, 17) + "..."); } else { Console.Write("{0, -20}|", element.Value); } Спасибо @Ev_Hyper за помощь!

пятница, 3 января 2020 г.

Пауза консоли в C++

#cpp #visual_cpp #консоль


Какие функции в Visual Studio (помимо system("pause");) останавливают закрытие консоли. 
    


Ответы

Ответ 1



Если речь идет только о работе в IDE, для приостановки работы программы можно использовать обычные точки останова и отладчик, какие-то специальные вызовы в коде не нужны. Более того, использование вызовов типа system("pause") приведет к тому, что программу невозможно будет нормально вызывать из пакетных файлов: она будет каждый раз ждать ввода с реальной консоли, даже если стандартный ввод перенаправлен из файла и ожидалась работа без участия пользователя. Но, если все же действительно нужно приостановить консоль при любом запуске программы, есть несколько вариантов: system("PAUSE"); Особенности: Отображает приглашение ввода ("Нажмите любую клавишу") Прерывает работу программы до нажатия любой клавиши Работает только под Windows (в других ОС нет команды PAUSE) Внутренне вызывает командный интерпретатор, поэтому считается "тяжелым" вариантом (если производительность что-то значит в данном случае) Есть миф, что такой вызов небезопасен, так как если поместить в папку с программой вредоносный файл pause.exe, он будет вызван вместо команды PAUSE. Это не так в современных версиях Windows. system("PAUSE>nul"); То же самое, но не отображает приглашение ввода. getchar(); //С cin.get(); //C++ Особенности: Не отображает приглашение ввода Прерывает работу программы до нажатия клавиши Enter Стандартная функция - работает в любом окружении В отличие от других вариантов, не ломает перенаправление стандартного ввода (достаточно поместить на вход строку любого содержания, и выполнение программы пойдет дальше). #include getch(); //Традиционная _getch(); //Современный вариант Особенности: Не отображает приглашение ввода Прерывает работу программы до нажатия любой клавиши Нестандартная функция, доступна в DOS и Windows (в других ОС есть похожие аналоги) Опять же, существует миф, что в Windows это какой-то DOSовский вызов и использовать его - дикий криминал. На самом деле, внутренне он реализуется как обычный вызов WINAPI-функции ReadConsoleInput, с предварительным отключением у консоли режима ENABLE_LINE_INPUT. Убедиться в этом можно, заглянув в исходники отладочной версии CRT, которые с некоторого времени частично открыты.

четверг, 2 января 2020 г.

Полетели шрифты в консоли

#linux #ubuntu #шрифты #консоль #elementary_os


В консоли линукса (elementary) полетели шрифты, во всех остальных приложениях шрифты
нормальные, устанавливал всё для msf и VirualBox, вот скрин:


    


Ответы

Ответ 1



Так как по Elementary OS пока не так много ответов в русскоязычном StackOverflow, переведу ответ с англоязычного ресурса, ссылку в комментариях на который предоставил KoVadim. Чтобы изменить шрифт в терминале, вам нужен dconf-editor. Установите его, если вы еще этого не сделали: sudo apt install dconf-tools Запустите его и следуйте по пути: org > gnome > desktop > interface > monospace-font-name Введите название нужного шрифта и размер шрифта. Например: Anonymous Pro 11. Вы также можете использовать команду: gsettings set org.pantheon.terminal.settings font 'Anonymous Pro 11' в терминале, вместо dconf-editor.