2013-03-20 17 views
5

Chcę odczytać ciąg z wiersza poleceń przez getline() w języku C++.Jak zaimplementować limit czasu dla getline()?

Do tego chcę dodać licznik czasu 5 sek. Jeśli żaden ciąg nie zostanie odczytany, program zostanie zakończony.

Jak mogę to zrobić?

+0

@RandyHoward: Nie sądzę, że to jest dokładną kopią. 'getline()' jest znacznie prostsze w użyciu, a wiedza o tym, jak dodać licznik, byłaby przydatna dla tych, którzy są nowi. To pytanie powinno pozostać uzasadnione. –

+0

@kassak: Nie, nadal nie jest to dokładny duplikat, odpowiedzi pokazują, że tak myślę. Tak czy siak, myślę, że jest to przydatne pytanie, ponieważ 'getline()' jest często używany, a wiedza, jak go dobrze używać, byłaby dobra dla przyszłych czytelników. Tylko moje 2 centy. –

+0

StackOverflow nie jest właściwym miejscem na to pytanie. Nie tworzymy twojego kodu dla ciebie. Musisz wykonać własne kodowanie i jeśli nie masz pewności, dlaczego coś nie działa zgodnie z oczekiwaniami, opublikuj kod z wyjaśnieniem, czego się spodziewałeś i co faktycznie robi, w tym wszystkie komunikaty o błędach. Zobacz [o StackOverflow] (http://stackoverflow.com/about). –

Odpowiedz

4

Jak o:

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

/* getline */ 

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

Alternatywnie można użyć setitimer.


jako R. Martinho Fernandes o:

FUNCTION alarm organizuje bieżącego procesu, aby otrzymać SIGALRM 5 sekund od ich połączenia. Domyślna akcja dla SIGALRM si kończy nienormalnie proces. Wywołanie alarm(0) wyłącza timer.

+1

Zastanawiam się, czy istnieje sposób na zamknięcie i ponowne otwarcie stdin lub coś, aby przedostać się przez oświadczenie getline ...? – sje397

+0

@cnicutar Thnq. zadziałało: P –

+0

i na końcu otrzymuję dane wyjściowe jako "Budzik". Jak to powstrzymać? thanks @cnicutar –

7

ok, czekać na 5 sek, a terminate jeżeli nie było wejścia:

#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 dla standardowego rozwiązania, hehe –

+0

bez użycia wątków pllzzz ... –

+0

@ user2164410 - czemu nie - jest to zwykły sposób radzenia sobie z takimi wymaganiami. Równie łatwo byłoby zezwolić na sygnalizację wejścia liniowego przed upływem 5 sekund, zamiast czekać do końca interwału. –