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

    +2

    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 >>" в винде не заюзать, я правильно понимаю?
        Ответить
        • Дык и буферизация - платформозависимая хрень. Поэтому сишка и кресты про нее как бы не в курсе.
          Ответить
          • В «реальном режиме» никакой буферизации нет. Именно поэтому я за «реальный режим».
            Ответить
          • Ну вообще есть много хрени, которая платформозависимая, но про которую кресты и сишка как бы в курсе.
            Например, https://ru.cppreference.com/w/c/thread
            Или вот в новых стандартах крестов есть какая-то хренота для работы с файловой системой в стандартной библиотеке https://en.cppreference.com/w/cpp/filesystem
            В общем это не аргумент.
            Ответить
        • > cin без буферизации в венде
          Х.з., может быть у венды тоже какой-то флажок есть. Гуглить надо.
          Ответить
        • а stty есть, лал
          Ответить
    • (если кто не понял насчет секурности - system("stty raw") можно ПЕРЕГРУЗИТЬ через переменную среды PATH, что особенно полезно в случае выставленного suid бита у программы)
      Ответить
      • cp virus stty
        Ответить
        • Именно поэтому в линупсе текущий каталог не в path.
          Ответить
      • это для мартышки которая про cfmakeraw не слышала?

        вообще странное желание конечно читать напрямую, когла есть readline и этот.. как его.. аналог не гнутый... забыл
        Ответить
        • readline вроде бы предназначена для ввода строки, а не для ввода символа. Это как текстовый редактор, но только для одной строки. Или я что-то путаю?
          Ответить
    • +[,.]
      Именно поэтому я за "Brainfuck".
      Ответить
    • и эти люид еще смеются на system("pause")
      Ответить
    • Нагуглил решение:
      http://rus-linux.net/MyLDP/BOOKS/programming-ground-up/02/groundup-ru-02-07-03.html

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

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