2013-03-20 15 views
5

Voglio leggere una stringa dalla riga di comando tramite getline() in C++.Come implementare il timeout per getline()?

Per quello voglio aggiungere un timer di 5 sec. Se nessuna stringa viene letta, il programma terminerà.

Come posso fare questo?

+0

@RandyHoward: Non credo che questo è un duplicato esatto. 'getline()' è molto più semplice da usare e sapere come aggiungere un contatore ad esso sarebbe utile per coloro che sono nuovi. Questa domanda dovrebbe rimanere legittima. –

+0

@kassak: No, non è ancora un duplicato esatto, le risposte lo dimostrano, penso. Ad ogni modo, penso che questa sia una domanda utile, perché 'getline()' è usato parecchio, e sapere come usarlo sarebbe utile per i futuri lettori. Solo i miei 2 centesimi. –

+0

StackOverflow non è il posto giusto per questa domanda. Non scriviamo il tuo codice per te. È necessario eseguire la propria codifica e, se non si è sicuri del motivo per cui qualcosa non funziona come previsto, inserire il codice con una spiegazione di ciò che si aspettava che facesse e di ciò che effettivamente sta facendo, inclusi tutti i messaggi di errore. Vedi [su StackOverflow] (http://stackoverflow.com/about). –

risposta

4

ne dite:

/* Wait 5 seconds. */ 
alarm(5); 

/* getline */ 

/* Cancel alarm. */ 
alarm(0); 

In alternativa è possibile utilizzare setitimer.


Come R. Martinho Fernandes richiesto:

La funzione alarm sistemi per il processo corrente per ricevere un SIGALRM in 5 secondi dalla chiamata. L'azione predefinita per un SIGALRM si per terminare il processo in modo anomalo. Chiamando alarm(0) disattiva il timer.

+1

Mi chiedo se c'è un modo per chiudere e riaprire stdin o qualcosa per superare la dichiarazione getline ...? – sje397

+0

@cnicutar Thnq. ha funzionato: P –

+0

e finalmente ricevo l'output come "Sveglia". Come sopprimere quello? grazie @cnicutar –

7

ok, attendere 5 sec, e terminate se non ci fosse di ingresso:

#include <thread> 
#include <atomic> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::atomic<bool> flag = false; 
    std::thread([&] 
    { 
     std::this_thread::sleep_for(std::chrono::seconds(5)); 

     if (!flag) 
      std::terminate(); 
    }).detach(); 

    std::string s; 
    std::getline(std::cin, s); 
    flag = true; 
    std::cout << s << '\n'; 
} 
+0

+1 per la soluzione standard, hehe –

+0

senza l'uso di fili pllzzz ... –

+0

@ user2164410 - perché no - è il solito modo di gestire tali requisiti. Sarebbe altrettanto facile consentire la segnalazione di un ingresso linea prima dei 5 secondi è, piuttosto che attendere la fine dell'intervallo. –

Problemi correlati