Come rendere la lettura dal timeout di `std :: cin` dopo un determinato periodo di tempo

Ho scritto un piccolo programma,

int main(int argc, char *argv[]) { int n; std::cout << "Before reading from cin" <> n; if (b) std::cout << "input is integer for n and it's correct" << std::endl; else std::cout << "Either n is not integer or no input for n" << std::endl; return 0; } 

La lettura da std::cin sta bloccando, quindi il programma attende fino a quando c’è un interrupt esterno (come i segnali anche) al programma o l’utente fornisce qualche input.

Come dovrei rendere la dichiarazione std::cin >> n aspettare un po ‘di tempo (magari usando sleep() chiamata di sistema) per l’input dell’utente? Se l’utente non fornisce input e dopo il completamento del tempo previsto (diciamo 10 secondi) il programma dovrebbe riprendere per l’istruzione successiva (cioè if (b==1) avanti).

Questo funziona per me (nota che questo non funzionerebbe in Windows però):

 #include  #include  using namespace std; int main(int argc, char *argv[]) { int n; cout<<"Before performing cin operation"<>n) : false; if(b==1) cout<<"input is integer for n and it's correct"< 

Non c’è modo di farlo usando le funzioni standard di C o C ++.

Esistono diversi modi per utilizzare codice non standard, ma molto probabilmente dovrai gestire input come stringa o singoli tasti, piuttosto che essere in grado di leggere input come cin >> x >> y; dove x e y sono variabili arbitrarie di qualsiasi tipo C ++.

Il modo più semplice per ottenere ciò sarebbe utilizzare la libreria ncurses, in particolare come se fossi su Linux.

La funzione di timeout ti consentirà di impostare un timeout (in millisecondi) e puoi usare getstr() per leggere una stringa, o scanw() per leggere l’input di stile scanf C.

Ho una brutta notizia per te: cin NON è una dichiarazione. È un object di tipo std :: istream che rimappa il file di input standard che il sistema operativo esegue per impostazione predefinita sulla console del programma.

Quali blocchi non è cin, ma l’editor di riga di console che la console stessa richiama quando l’input standard viene letto con un buffer vuoto.

Quello che stai chiedendo è anticipato dal modello di input standard che cin dovrebbe includere e non può essere implementato come funzionalità istream.

L’unico modo pulito per farlo è utilizzare la funzionalità I / O nativa della console, per ottenere eventi utente e, in base all’eventualità, fare affidamento sui flussi C ++ solo dopo aver analizzato alcuni caratteri.