2013-03-20 2 views
5

C++에서 명령 행에서 getline()을 통해 문자열을 읽길 원합니다.getline()에 대한 시간 제한을 구현하는 방법은 무엇입니까?

나는 타이머를 5 초에 추가하려고합니다. 읽은 문자열이 없으면 프로그램이 종료됩니다.

어떻게하면됩니까?

+0

@RandyHoward을 :이 정확한 중복 생각하지 않습니다. 'getline()'은 사용하기가 훨씬 쉽고 카운터를 추가하는 방법을 알고 있으면 새로운 사람들에게 유용 할 것입니다. 이 질문은 합법적이어야합니다. –

+0

@kassak : 아뇨, 아직도 정확한 복제본이 아닙니다. 어쨌든, 이것은'getline()'이 꽤 많이 사용되기 때문에 이것이 유용한 질문이라고 생각합니다. 잘 사용하는 방법은 미래의 독자들에게 좋을 것입니다. 단지 2 센트. –

+0

StackOverflow는이 질문에 적절한 위치가 아닙니다. 우리는 당신의 코드를 작성하지 않습니다. 당신은 당신 자신의 코딩을 할 필요가있다. 왜 무언가가 예상대로 작동하지 않는 것인지 잘 모르겠다면, 당신이 기대하고있는 것에 대한 설명과 함께 그리고 모든 에러 메시지를 포함하여 실제로 무엇을하는지에 대한 코드를 게시한다. See [StackOverflow에 대한] (http://stackoverflow.com/about). –

답변

4

방법에 대해 :

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

/* getline */ 

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

는 다른 방법이 setitimer을 사용할 수 있습니다.

로서 R. 마르틴 페르난데스 요청한 : 현재 프로세스

함수를 준비한다 alarm 그 호는 5 초 단위 SIGALRM 수신. SIGALRM si가 프로세스를 비정상적으로 종료하는 기본 작업입니다. alarm(0)을 호출하면 타이머가 비활성화됩니다. 아무런 입력이 없었다 경우 확인

+1

stdin을 닫고 다시 열어 getline 문을 지나치는 방법이 있는지 궁금합니다 ...? – sje397

+0

@cnicutar Thnq. 그것은 작동했습니다 : P –

+0

그리고 마침내 "알람 시계"로 출력되고 있습니다. 그 하나를 억제하는 방법 ??? 덕분에 @ cnicutar –

7

, 5 초 동안 기다린 terminate :

#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

표준 솔루션의 경우 hehe –

+0

스레드를 사용하지 않음 pllzzz ... –

+0

@ user2164410 - 왜 그런 요구 사항을 처리하는지는 알 수 없습니다. 간격이 끝날 때까지 기다리는 것이 아니라 5 초가되기 전에 회선 항목 신호를 허용하는 것이 쉽습니다. –

관련 문제