Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
// https://www.tutorialspoint.com/Read-a-character-from-standard-input-without-waiting-for-a-newline-in-Cplusplus
// A portable solution doesn't exist for doing this. On windows, you can use the getch() function from the conio(Console I/O) library to get characters pressed. For example,
#include<iostream>
#include<conio.h>
using namespace std;
int main() {
char c;
while(1){ // infinite loop
c = getch();
cout << c;
}
}
// This will output whatever character you input to the terminal. Note that this will only work on windows as the conio library exists only on windows. On UNIX, you can achieve this by entering in system raw mode. For example,
#include<iostream>
#include<stdio.h>
int main() {
char c;
// Set the terminal to raw mode
system("stty raw");
while(1) {
c = getchar();
// terminate when "." is pressed
if(c == '.') {
system("stty cooked");
exit(0);
}
std::cout << c << " was pressed."<< std::endl;
}
}
Ну это все позикс хрень. В стандарте C/C++ этого тупо нет.
Т.е. с отрубленной построчной буферизацией "std::cin >>" в винде не заюзать, я правильно понимаю?
Ну вообще есть много хрени, которая платформозависимая, но про которую кресты и сишка как бы в курсе.
Например, https://ru.cppreference.com/w/c/thread
Или вот в новых стандартах крестов есть какая-то хренота для работы с файловой системой в стандартной библиотеке https://en.cppreference.com/w/cpp/filesystem
В общем это не аргумент.
Когда-нибудь затащут и хуёвую абстракцию над терминалами, наверное. Хуёвые источники рандома и времени тоже ведь затащили (нельзя просто скопировать с буста, надо испортить).
Ну и отключенная буферизация нужна только для всякой текстовой гуйни, а там эта самая буферизация - самая мелкая из проблем, с которыми придётся ебаться...
блядь
я пол часа тебе ответ писал на ру и он уехал в halted by exception. В жопу говнокод.
Короче, часть stty можно реализовать и на винде (rows/cols например). А часть (esc последовательности) даже шелы с ридлайном имеют право игнорить. А speed вообщзе хз кому нужен
подсистема tty это помойка, кукд мод устарел. Ну ничего, поттеринг до него доберется
(если кто не понял насчет секурности - system("stty raw") можно ПЕРЕГРУЗИТЬ через переменную среды PATH, что особенно полезно в случае выставленного suid бита у программы)
Функция rl_callback_read_char читает символ, но нам его не возвращает. Она вызывает предварительно установленный нами обработчик, если заметила признак конца строки. Т. е. наш обработчик сможет прочитать только целиком строку, завершающуюся ентером.
ncurses –— клёвая! С помощью неё можно и курсор перемещать и раскрашивать. И ungetch делать, если вдруг передумали читать. И даже узнать, кокококой символ сейчас отображается в произвольном месте окна.
ncurses вообще позволяет много чего делать с терминалом (если терминал это позволяет). Это крутая обертка над termcap/terminfo, и думаю что mc на ней писан (но не уверен)
Т.е. с отрубленной построчной буферизацией "std::cin >>" в винде не заюзать, я правильно понимаю?
по умолчанию в реальном режиме на обработчике прерывания от клавиатуры висит обработчик, который туда вешает биос
Этот обработчик буферизуерует нажатие клавые и потом начинает противно пищать
Игроделы 90х его обычно убивали и вешали свой, без всякого буфера
Например, https://ru.cppreference.com/w/c/thread
Или вот в новых стандартах крестов есть какая-то хренота для работы с файловой системой в стандартной библиотеке https://en.cppreference.com/w/cpp/filesystem
В общем это не аргумент.
В бюсте cmwc есть ?
Х.з., может быть у венды тоже какой-то флажок есть. Гуглить надо.
я пол часа тебе ответ писал на ру и он уехал в halted by exception. В жопу говнокод.
Короче, часть stty можно реализовать и на винде (rows/cols например). А часть (esc последовательности) даже шелы с ридлайном имеют право игнорить. А speed вообщзе хз кому нужен
подсистема tty это помойка, кукд мод устарел. Ну ничего, поттеринг до него доберется
вообще странное желание конечно читать напрямую, когла есть readline и этот.. как его.. аналог не гнутый... забыл
http://www.delorie.com/gnu/docs/readline/rlman_41.html
Функция rl_callback_read_char читает символ, но нам его не возвращает. Она вызывает предварительно установленный нами обработчик, если заметила признак конца строки. Т. е. наш обработчик сможет прочитать только целиком строку, завершающуюся ентером.
звиняй кумо, обосравсi
значит, только из tty читать. Ну все равно же через termios это делать, а не через внещнюю (!!) программу
Кстати, у ncurses есть getch
https://linux.die.net/man/3/getch
В общем, можно текстовый «Тетрис» соорудить.
ncurses вообще позволяет много чего делать с терминалом (если терминал это позволяет). Это крутая обертка над termcap/terminfo, и думаю что mc на ней писан (но не уверен)
как в Dos Navigator?:)
Кстати,
https://www.debian.org/doc/manuals/aptitude/ch02s06.en.html
http://rus-linux.net/MyLDP/BOOKS/programming-ground-up/02/groundup-ru-02-07-03.html
Как видим, всё очень просто.