Символы получения от стандартного входа, не ожидая входят, чтобы быть нажатыми

Используйте PDO и подготовленные запросы.

($conn - объект PDO)

$stmt = $conn->prepare("INSERT INTO tbl VALUES(:id, :name)");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':name', $name);
$stmt->execute();
162
задан jww 20 September 2014 в 07:44
поделиться

9 ответов

Это не возможно портативным способом в чистом C++, потому что он зависит слишком много от терминала, используемого, который может быть соединен с stdin (они обычно - буферизованная строка). Вы можете, однако пользоваться библиотекой для этого:

  1. conio доступный с компиляторами Windows. Используйте эти _getch() функция, чтобы дать Вам символ, не ожидая клавиши Enter. Я не частый разработчик Windows, но я видел своих одноклассников просто включать <conio.h> и использую его. См. conio.h в Википедии. Это перечисляет getch(), который объявляется удержанный от использования в Visual C++.

  2. проклятия, доступные для Linux. Совместимые реализации проклятий доступны для Windows также. Это имеет также getch() функция. (попробуйте man getch для просмотра его страницы справочника). См. Проклятия в Википедии.

я рекомендовал бы Вам использовать проклятия, если Вы стремитесь к кросс-платформенной совместимости. Однако я уверен, что существуют функции, которые можно использовать для выключения буферизации строки (я полагаю, что это называют "режимом без предварительной обработки", в противоположность "режиму с обработкой" - изучают man stty). Проклятия обработали бы это для Вас портативным способом, если я не ошибаюсь.

90
ответ дан Remy Lebeau 23 November 2019 в 21:22
поделиться

Следующее является решением, извлеченным от Опытное Программирование C: Непостижимые тайны , который, как предполагается, работает над SVr4. Это использует stty и ioctl.

#include <sys/filio.h>
int kbhit()
{
 int i;
 ioctl(0, FIONREAD, &i);
 return i; /* return a count of chars available to read */
}
main()
{
 int i = 0;
 intc='';
 system("stty raw -echo");
 printf("enter 'q' to quit \n");
 for (;c!='q';i++) {
    if (kbhit()) {
        c=getchar();
       printf("\n got %c, on iteration %d",c, i);
    }
}
 system("stty cooked echo");
}
3
ответ дан PolyThinker 23 November 2019 в 21:22
поделиться

Принятие Windows, смотрите на функция ReadConsoleInput.

5
ответ дан Tritium 23 November 2019 в 21:22
поделиться

Если Вы находитесь на окнах, можно использовать PeekConsoleInput, чтобы обнаружить, если существует какой-либо вход,

HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD events;
INPUT_RECORD buffer;
PeekConsoleInput( handle, &buffer, 1, &events );

тогда использование ReadConsoleInput для "использования" вводимого символа..

PeekConsoleInput(handle, &buffer, 1, &events);
if(events > 0)
{
    ReadConsoleInput(handle, &buffer, 1, &events);  
    return buffer.Event.KeyEvent.wVirtualKeyCode;
}
else return 0

, чтобы быть честным это от некоторого старого кода, который я имею, таким образом, необходимо играть немного с ним.

прохладная вещь, хотя то, что она читает вход, не запрашивая ничто, таким образом, символы не отображены вообще.

9
ответ дан hasen 23 November 2019 в 21:22
поделиться

CONIO.H

функции, в которых Вы нуждаетесь:

int getch();
Prototype
    int _getch(void); 
Description
    _getch obtains a character  from stdin. Input is unbuffered, and this
    routine  will  return as  soon as  a character is  available  without 
    waiting for a carriage return. The character is not echoed to stdout.
    _getch bypasses the normal buffering done by getchar and getc. ungetc 
    cannot be used with _getch. 
Synonym
    Function: getch 


int kbhit();
Description
    Checks if a keyboard key has been pressed but not yet read. 
Return Value
    Returns a non-zero value if a key was pressed. Otherwise, returns 0.

libconio http://sourceforge.net/projects/libconio

или

реализация C++ Linux conio.h http://sourceforge.net/projects/linux-conioh

14
ответ дан chrissidtmeier 23 November 2019 в 21:22
поделиться

C и C++ получают очень абстрактное представление ввода-вывода, и нет никакого стандартного способа сделать то, что Вы хотите. Существуют стандартные способы получить символы от стандартного входного потока, если существует кто-либо для получения, и ничто иное не определяется ни одним языком. Любой ответ должен будет поэтому быть определенным для платформы, возможно, зависящий не только от операционной системы, но также и платформы программного обеспечения.

здесь существуют некоторые разумные предположения, но нет никакого способа ответить на Ваш вопрос, не зная, какова Ваша целевая среда.

5
ответ дан David Thornley 23 November 2019 в 21:22
поделиться

Самая близкая вещь к портативному устройству состоит в том, чтобы использовать ncurses библиотека для помещения терминала в "cbreak режим". API является гигантским; стандартные программы, которые Вы захотите больше всего,

  • initscr и endwin
  • cbreak и nocbreak
  • getch

Удачи!

4
ответ дан Norman Ramsey 23 November 2019 в 21:22
поделиться

Я нашел это на другом форуме, пытаясь решить ту же проблему. Я немного изменил это из того, что нашел. Отлично работает. Я использую OS X, поэтому, если вы используете Microsoft, вам нужно будет найти правильную команду system (), чтобы переключиться в режимы raw и cooked.

#include <iostream> 
#include <stdio.h>  
using namespace std;  

int main() { 
  // Output prompt 
  cout << "Press any key to continue..." << endl; 

  // Set terminal to raw mode 
  system("stty raw"); 

  // Wait for single character 
  char input = getchar(); 

  // Echo input:
  cout << "--" << input << "--";

  // Reset terminal to normal "cooked" mode 
  system("stty cooked"); 

  // And we're out of here 
  return 0; 
}
16
ответ дан 23 November 2019 в 21:22
поделиться

В Linux (и других unix-подобных системах) это можно сделать следующим образом:

#include <unistd.h>
#include <termios.h>

char getch() {
        char buf = 0;
        struct termios old = {0};
        if (tcgetattr(0, &old) < 0)
                perror("tcsetattr()");
        old.c_lflag &= ~ICANON;
        old.c_lflag &= ~ECHO;
        old.c_cc[VMIN] = 1;
        old.c_cc[VTIME] = 0;
        if (tcsetattr(0, TCSANOW, &old) < 0)
                perror("tcsetattr ICANON");
        if (read(0, &buf, 1) < 0)
                perror ("read()");
        old.c_lflag |= ICANON;
        old.c_lflag |= ECHO;
        if (tcsetattr(0, TCSADRAIN, &old) < 0)
                perror ("tcsetattr ~ICANON");
        return (buf);
}

Обычно вам нужно отключить канонический режим (и режим эха для подавления эха).

77
ответ дан 23 November 2019 в 21:22
поделиться