2013-05-16 46 views
5

Czy istnieje sposób sprawdzenia, czy w czytniku znajdują się znaki, a jeśli tak, w jaki sposób mogę to zrobić. Jeśli wiesz na pewno, że nie jest to możliwe, proszę powiedz mi to.C++ std :: ifstream: sprawdź, czy znaki są pozostawione do odczytu:

EDYCJA: Zmieniłem moje pytanie na bardziej ogólne.

+0

W niektórych usuniętych komentarzach wspomniałeś o blokowaniu. Aby było jasne, nie da się tego zrobić bez blokowania. –

Odpowiedz

4

Aby dostać co pytasz o po edycji, można użyć funkcji peek():

Biorąc pod uwagę std::ifstream nazywa f

if(f && f.peek() == EOF) 
     std::cout << "Nothing left to read\n"; 
    else 
     std::cout << "There is something to read or the stream is bad\n"; 

należy jednak pamiętać, że nie jest to „bardziej ogólnie” pytanie, to jest inna kwestia (czyli stosując do tego zapytania oryginalnego ran ld być błędem)

+0

Pomyślałem, że to jest to samo pytanie, ponieważ chciałem tylko dowiedzieć się, czy istnieją znaki do przeczytania. Wszystko, co napisałem w moim początkowym pytaniu, to wyjaśnienie, dlaczego chciałbym mieć te informacje: Ponieważ chcę wiedzieć, czy wykonanie odczytu blokowałoby lub nie, co uważałem za jedynie przyczynę zadawania pytania, a nie części samego pytania . Jak się okazuje, ta informacja jest niezbędna do rozwiązania mojego problemu, więc powinienem zadać inne pytanie. Zostawię więc pytanie tak, jak początkowo chciałem (jak jest teraz) i rozważam zadawanie nowego. – FSMaxB

+0

@FSMaxB Jak wskazuje MooingDuck, nie da się tego zrobić bez blokowania, czyli bez czytania lub próby odczytu i niepowodzenia, następnego znaku z ** powiązanej sekwencji znaków ** (w niektórych usuniętych wersjach wspomniałeś port szeregowy) do bufora, który istnieje w obiekcie ifstream. Zerknięta postać pozostanie nieprzeczytana, więc następny odczyt z ifstream zwróci ją, ale stanie się to dopiero po dotarciu z urządzenia zewnętrznego do strumienia. – Cubbi

2

Należy umieścić operację odczytu w stanie while:

while(stream >> buffer) { 
    ... 

który wczyta aż strumień jest pusta lub wystąpi inny błąd.

... ale jeśli naprawdę starają się odczytać jeden znak naraz, należy przeczytać: Reading a single character from an fstream?

+0

strumień >> bufor jest zawsze blokowany, nie ma znaczenia, gdzie go umieścić. – FSMaxB

+0

Rozwiązanie w twoim linku też się blokuje. – FSMaxB