2011-01-15 8 views
5

Bir C++ uygulaması için, stdin'de bir dosya sonu (EOF) program aracılığıyla nasıl zorlayabilirim?Stdin’de nasıl zorlanırım?

+0

Nasıl 'stdin'de EOF'yi zorlamak'? Stdin'i (veya cin) kapatabilirsin. Döngününüzü tek taraflı olarak sonlandırabilirsiniz. Dosyanın sonuna kadar arama yapabilirsiniz (ancak bu, bir terminal veya boru girişi ile yardımcı olmaz). Sorunu 'freopen()' ile zorlayabilirsiniz;/dev/null veya NUL: 'den okumak için standart girişi yeniden atayabilirsiniz. –

cevap

6

Aslında yapamazsınız. Stdin'den veri okuyabildiğiniz sürece, EOF'a ulaşılamamış ve aslında ona asla ulaşamazsınız. Bununla birlikte, stdin'un kendisini kapatabilirsiniz. Kapatmak için, bunu:

fclose(stdin); 

Bunlardan sonra, stdin verileri okuyamaz.

8

Unix benzeri bir sistemde bir terminaldeyseniz, Ctrl-D'a basın. Windows'ta, Ctrl-Z.

Düzenleme: Bunu "programlı olarak" yapma isteğini görünce, fclose(stdin)'u denemenizi öneririz. Bir şekilde yeterince iyi değilse, gerçek bir dedikodudan başka bir şeye başvurmak için akışı ayarlamak için std::cin.rdbuf() kullanmak ve daha sonra bu akışa istediğiniz şeyi yapmak çılgın bir fikir olabilir. Ama bu kötü kokmaya başlar, tıpkı bilgisayara karşı savaştığınız gibi, gerçek hedefin ne olduğu hakkında daha fazla bilgi edinmek isterim.

+0

Ancak bu bir C++ uygulamasından geliyor, bu yüzden Ctrl-D çalışması gönderiyor mu? – WilliamKF

+0

Şimdi "programlı olarak" görüyorum. Belki ne yapmaya çalıştığını daha detaylı tarif edebilirsin? –

+1

Sadece stdin'e 0x1A (Ctrl + Z için ASCII kodu) yaz. – Tergiver

1

Özellikle bunun için oluşturulan her akış için güzel bir küçük işlev var.

 std::cin.setstate(std::cin.eofbit); 


bu belgeleri oldukça seyrek ama bazı var:

 stream.setstate(stream.flags) 


Yani kodunuzda gibi bir şey tetikleyen basit bir koşul olabilir:

Bu sözdizimi olan bir şey gibidir cppreference.com ve cplusplus.com.