Đối với ứng dụng C++, làm thế nào tôi có thể lập trình buộc kết thúc tệp (EOF) trên stdin?Làm thế nào để ép eof trên stdin?
Trả lời
Thực ra, bạn không thể. Miễn là bạn có thể đọc dữ liệu từ stdin, EOF đã không đạt được, và trên thực tế bạn không bao giờ có thể đạt được nó. Tuy nhiên, bạn có thể tự đóng cửa stdin
. Để đóng, hãy thực hiện việc này:
fclose(stdin);
Sau này, bạn không thể đọc dữ liệu từ stdin
.
Nếu bạn đang ở một thiết bị đầu cuối trong hệ thống giống Unix, hãy nhấn Ctrl-D
. Trong Windows, Ctrl-Z
.
Chỉnh sửa: Đã thấy mong muốn thực hiện điều này "theo lập trình", tôi khuyên bạn nên thử fclose(stdin)
. Nếu bằng cách nào đó đó là không đủ tốt, một ý tưởng điên rồ hơn có thể là sử dụng std::cin.rdbuf()
để đặt luồng để tham chiếu đến một cái gì đó khác với stdin thực, và sau đó làm những gì bạn muốn luồng đó. Nhưng điều này bắt đầu có mùi hôi, giống như bạn đang chiến đấu chống lại máy tính, vì vậy tôi muốn biết thêm về mục tiêu thực sự là gì.
Có một chức năng nhỏ gọn có sẵn cho mọi luồng được tạo đặc biệt cho điều này.
Đó là cú pháp là một cái gì đó như:
stream.setstate(stream.flags)
Vì vậy, trong mã của bạn, bạn có thể có một điều kiện đơn giản mà gây nên một cái gì đó như:
std::cin.setstate(std::cin.eofbit);
Các tài liệu cho điều này là khá thưa thớt nhưng có một số trên cppreference.com và cplusplus.com.
Ý của bạn là 'force EOF on stdin'? Bạn có thể đóng stdin (hoặc cin). Bạn có thể có vòng lặp của bạn chấm dứt đơn phương. Bạn có thể tìm đến cuối tập tin (nhưng điều đó sẽ không giúp ích gì đối với thiết bị đầu cuối hoặc đường ống). Bạn có thể ép buộc vấn đề bằng 'freopen()'; gán lại đầu vào tiêu chuẩn để đọc từ/dev/null hoặc NUL :. –