2013-03-20 6 views
5

Tôi muốn đọc một chuỗi từ dòng lệnh thông qua getline() bằng C++.Làm thế nào để thực hiện thời gian chờ cho getline()?

Để làm điều đó, tôi muốn thêm bộ hẹn giờ 5 giây. Nếu không đọc chuỗi, chương trình sẽ chấm dứt.

Tôi làm cách nào để thực hiện việc này?

+0

@RandyHoward: Tôi không nghĩ rằng đây là một bản sao chính xác. 'getline()' là đơn giản hơn nhiều để sử dụng, và biết làm thế nào để thêm một truy cập vào nó sẽ hữu ích cho những người mới. Câu hỏi này nên vẫn còn hợp pháp. –

+0

@ kassak: Không, vẫn không phải là một bản sao chính xác, câu trả lời cho thấy rằng, tôi nghĩ. Dù bằng cách nào, tôi nghĩ rằng đây là một câu hỏi hữu ích, bởi vì 'getline()' được sử dụng khá nhiều, và biết cách sử dụng nó tốt sẽ tốt cho người đọc trong tương lai. Chỉ cần 2 xu của tôi. –

+0

StackOverflow không phải là nơi thích hợp cho câu hỏi này. Chúng tôi không viết mã cho bạn. Bạn cần phải viết mã của riêng bạn và nếu bạn không chắc chắn tại sao một cái gì đó không hoạt động như mong đợi, hãy đăng mã với lời giải thích về những gì bạn đang mong đợi, và những gì nó thực sự làm bao gồm tất cả các thông báo lỗi. Xem [về StackOverflow] (http://stackoverflow.com/about). –

Trả lời

4

Làm thế nào về:

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

/* getline */ 

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

Hoặc bạn có thể sử dụng setitimer.


Như R. Martinho Fernandes yêu cầu:

Chức năng alarm xếp thứ cho quá trình hiện tại để nhận được một SIGALRM trong 5 giây từ cuộc gọi của nó. Hành động mặc định cho số SIGALRM si để chấm dứt quá trình bất thường. Gọi số alarm(0) sẽ tắt hẹn giờ.

+1

Tôi tự hỏi nếu có một cách để đóng và mở lại stdin hoặc một cái gì đó để vượt qua tuyên bố getline ...? – sje397

+0

@cnicutar Thnq. nó hoạt động: P –

+0

và cuối cùng tôi nhận được đầu ra là "Đồng hồ báo thức". Làm thế nào để ngăn chặn cái đó ??? thanks @cnicutar –

7

ok, chờ 5 giây, và terminate nếu không có đầu vào:

#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 cho giải pháp tiêu chuẩn, hehe –

+0

với việc sử dụng các chủ đề pllzzz ... –

+0

@ user2164410 - tại sao không - đó là cách thông thường để xử lý các yêu cầu đó. Nó sẽ chỉ là dễ dàng để cho phép các tín hiệu của một mục dòng trước khi 5 giây là lên, thay vì chờ đợi cho đến khi kết thúc khoảng thời gian. –