1. C++ / Говнокод #25319

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    // 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;
        }
    }

    Вариант под UNIX еще и очень секурный, ЕВПОЧЯ

    Запостил: j123123, 22 Января 2019

    Комментарии (39) RSS

    • Что вообще стандарт C++ говорит о смешивании getch() и iostream? Хотя он скорее всего нихуя не говорит т.к. getch() в стандарте тупо нет.
      Ответить
    • Построчную буферизацию вроде можно было вырубить через tcsetattr()...
      Ответить
      • Ну это все позикс хрень. В стандарте C/C++ этого тупо нет.
        Т.е. с отрубленной построчной буферизацией "std::cin >>" в винде не заюзать, я правильно понимаю?
        Ответить
        • Дык и буферизация - платформозависимая хрень. Поэтому сишка и кресты про нее как бы не в курсе.
          Ответить
          • В «реальном режиме» никакой буферизации нет. Именно поэтому я за «реальный режим».
            Ответить
            • Буферизация есть, но она не мешается.
              Ответить
            • В «реальном режиме» можно писать прямо в видеопамять, четко и дерзко. Без анскильного знакогенератора
              Ответить
              • В "реальном режиме" эта самая видеопамять в адресное пространство не влезает. Поэтому я за "защищённый режим".
                Ответить
            • Как минимум всегда есть клавиатурный буфер, хранит последние нажатые клавешы.
              Ответить
              • да, но его можно отключить

                по умолчанию в реальном режиме на обработчике прерывания от клавиатуры висит обработчик, который туда вешает биос

                Этот обработчик буферизуерует нажатие клавые и потом начинает противно пищать

                Игроделы 90х его обычно убивали и вешали свой, без всякого буфера
                Ответить
          • Ну вообще есть много хрени, которая платформозависимая, но про которую кресты и сишка как бы в курсе.
            Например, https://ru.cppreference.com/w/c/thread
            Или вот в новых стандартах крестов есть какая-то хренота для работы с файловой системой в стандартной библиотеке https://en.cppreference.com/w/cpp/filesystem
            В общем это не аргумент.
            Ответить
            • Когда-нибудь затащут и хуёвую абстракцию над терминалами, наверное. Хуёвые источники рандома и времени тоже ведь затащили (нельзя просто скопировать с буста, надо испортить).
              Ответить
              • А чо там в бюсте лучше с рандомом, чем в стандарте ?
                В бюсте cmwc есть ?
                Ответить
                • Cycle Messenger World Championships?
                  Ответить
                  • камплишен мультпли уиз карри
                    Ответить
                    • Таки он. И его щщяс наряду с мерсен твистором в стандарт уже завезли. И чо там по сравнению с бюстом попортили ?
                      Ответить
                • В mingw рандом девайс тупо возвращал байтики из rand(). В бюсте такой хуйни не было.
                  Ответить
              • Вам что, не нравятся божественные std::chrono::time_point<std::chrono::ste ady_clock> start = std::chrono::steady_clock::now(); std::chrono::milliseconds elapsed = duration_cast<milliseconds>(std::chrono: :steady_clock::now() - start);?!
                Ответить
            • Ну и отключенная буферизация нужна только для всякой текстовой гуйни, а там эта самая буферизация - самая мелкая из проблем, с которыми придётся ебаться...
              Ответить
        • > cin без буферизации в венде
          Х.з., может быть у венды тоже какой-то флажок есть. Гуглить надо.
          Ответить
        • а stty есть, лал
          Ответить
          • „stty“ в „MSYS“ и в „Cygwin“ есть, больше нигде. Даже в чистом „Mingw“ без „MSYS“ нет, потому что для него нужен позиксовый слой.
            Ответить
            • блядь
              я пол часа тебе ответ писал на ру и он уехал в halted by exception. В жопу говнокод.

              Короче, часть stty можно реализовать и на винде (rows/cols например). А часть (esc последовательности) даже шелы с ридлайном имеют право игнорить. А speed вообщзе хз кому нужен


              подсистема tty это помойка, кукд мод устарел. Ну ничего, поттеринг до него доберется
              Ответить
    • (если кто не понял насчет секурности - system("stty raw") можно ПЕРЕГРУЗИТЬ через переменную среды PATH, что особенно полезно в случае выставленного suid бита у программы)
      Ответить
      • cp virus stty
        Ответить
        • Именно поэтому в линупсе текущий каталог не в path.
          Ответить
      • это для мартышки которая про cfmakeraw не слышала?

        вообще странное желание конечно читать напрямую, когла есть readline и этот.. как его.. аналог не гнутый... забыл
        Ответить
        • readline вроде бы предназначена для ввода строки, а не для ввода символа. Это как текстовый редактор, но только для одной строки. Или я что-то путаю?
          Ответить
          • ня;)
            http://www.delorie.com/gnu/docs/readline/rlman_41.html
            Ответить
            • Прочитал.

              Функция rl_callback_read_char читает символ, но нам его не возвращает. Она вызывает предварительно установленный нами обработчик, если заметила признак конца строки. Т. е. наш обработчик сможет прочитать только целиком строку, завершающуюся ентером.
              Ответить
              • >e. If that character completes the line
                звиняй кумо, обосравсi

                значит, только из tty читать. Ну все равно же через termios это делать, а не через внещнюю (!!) программу

                Кстати, у ncurses есть getch
                https://linux.die.net/man/3/getch
                Ответить
                • ncurses –— клёвая! С помощью неё можно и курсор перемещать и раскрашивать. И ungetch делать, если вдруг передумали читать. И даже узнать, кокококой символ сейчас отображается в произвольном месте окна.

                  В общем, можно текстовый «Тетрис» соорудить.
                  Ответить
                  • почти как "crt.tpu", да?:)

                    ncurses вообще позволяет много чего делать с терминалом (если терминал это позволяет). Это крутая обертка над termcap/terminfo, и думаю что mc на ней писан (но не уверен)
                    Ответить
                  • >В общем, можно текстовый «Тетрис» соорудить.
                    как в Dos Navigator?:)

                    Кстати,
                    https://www.debian.org/doc/manuals/aptitude/ch02s06.en.html
                    Ответить
    • +[,.]
      Именно поэтому я за "Brainfuck".
      Ответить
    • и эти люид еще смеются на system("pause")
      Ответить
    • Нагуглил решение:
      http://rus-linux.net/MyLDP/BOOKS/programming-ground-up/02/groundup-ru-02-07-03.html

      Как видим, всё очень просто.
      Ответить

    Добавить комментарий