Wystarczy, że zrobisz tak:
wewy >> litera;
while (!wewy.eof())
{ cout << litera;
wewy >> litera;
}
Jest to spowodowane tym, że w Twoim kodzie domyślnie znak pobierasz dopiero w pętli while(). Tyle, że warunek domyślnie jest spełniony, bo początek pliku nie jest jego końcem - jakkolwiek by to komicznie nie brzmiało - więc dostajesz coś takiego:
Sprawdzasz warunek - zgadza się, to nie koniec pliku
Pobierasz znak do zmiennej
Wypisujesz znak
Sprawdzasz warunek - to też nie jest koniec pliku, bo skończyłeś na literze 'a'
Pobierasz znak - koniec pliku
Nie wypisujesz znaku
Sprawdzasz warunek - nie jest spełniony, koniec pętli.
Jeśli się mylę, niech mnie ktoś poprawi. Sam to rozgryzłem i nie wiem, czy aby na pewno dobrze.
EDIT: Co do metody clear() - z tego co wyczytałem, to czyści ona flagę błędu, która to jest ustawiana na 1, gdy pobierasz znak końca pliku.
Co nieco się pobawiłem tym kodem i bez czyszczenia program robi mniej więcej tak:
Wczytuje następną literę, czyli 'b'. Próbujesz ją wczytać do pliku, ale się to nie udaje. Następnie nie udaje się w ogóle odczytać już zapisanego 'a', więc w zmiennej 'litera' mamy wartość 'b'. Po wykonaniu wewy.seekg(0) metoda wewy.eof() zwraca 0, więc program wykonuje pętlę while(...) i tak nieskończoność, bo w pętli również nie udaje nam się pobrać następnego znaku z pliku.
Wobec tego metoda clear() musi zerować jeszcze jakieś inne błędy, ale to już poczekajmy, aż ktoś biegły w języku się wypowie, jak działa ta metoda.