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ć?
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ć?
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.
Zastanawiam się, czy istnieje sposób na zamknięcie i ponowne otwarcie stdin lub coś, aby przedostać się przez oświadczenie getline ...? – sje397
@cnicutar Thnq. zadziałało: P –
i na końcu otrzymuję dane wyjściowe jako "Budzik". Jak to powstrzymać? thanks @cnicutar –
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';
}
+1 dla standardowego rozwiązania, hehe –
bez użycia wątków pllzzz ... –
@ 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. –
@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. –
@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. –
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). –