[Lekcja 35] Zadanie 1
Ostatnio zmodyfikowano 2015-04-15 16:59
Gage Temat założony przez niniejszego użytkownika |
[Lekcja 35] Zadanie 1 » 2015-04-08 19:56:57 Witam! Dziś mam problem z zadaniem z lekcji 35 o treści: Napisz program, który odczytuje co trzeci znak z pliku. Użyj do tego metod poznanych w niniejszym rozdziale. Przetestuj poprawność działania programu na bardzo krótkim pliku tekstowym, wypisując co trzeci odczytany znak na ekranie. Mianowicie, z niewiadomej przyczyny, program nie działa tak, jak powinien. Po pierwsze - z tego, co mi się wydawało, zapis plik.seekg(3), oznacza wczytywanie od 4 znaku, a wczytuje od trzeciego. W pętli również wszystko wypisuje w porządku, ale ustawienie to 4 (mimo, że wczytuje co trzeci znak). Pytanie kieruję, mimo tego, że działa, ponieważ chciałbym jednak coś wynieść z tych lekcji z możliwie najmniejszą liczbą niezrozumień. Z tego, co się do tej pory dowiedziałem - kompilator nie liczy znaków białych. Treść pliku to: 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 Celem jest wczytywanie samych trójek. Cel został spełniony, ale nie rozumiem, dlaczego musiałem przy obu seekg dodać 1. Dzięki za odpowiedzi! #include <iostream> #include <fstream>
using namespace std;
int main() { fstream plik; plik.open( "D:/asd.txt" ); if( !plik.good() ) return 0; int b; plik.seekg( 3 ); plik >> b; cout << b; while( !plik.eof() ) { plik.seekg( plik.tellg() + 4 ); plik >> b; cout << b; } }
|
|
Gage Temat założony przez niniejszego użytkownika |
» 2015-04-08 20:03:59 Dodatkowo wypisuje o jedną 3 za dużo. Program działa dokładnie tak samo, kiedy usunę linijki: plik.seekg( 3 ); plik >> b; cout << b; |
|
Nitr0Skay |
» 2015-04-12 07:40:01 Bo w istocie te linijki nie są potrzebne. W pętli ma pan to: plik.seekg( plik.tellg() + 4 ); plik >> b; cout << b;
plik.seekg() przyjmuje jako argument pozycję ustawienia bufora w pliku równą plik.tellg() powiększoną o 4. Skoro korzysta Pan z pętli, nie lepiej byłoby skorzystać z modyfikatora, który będzie przesuwał pozycję w metodzie seekg() na początku pętli, a będzie modyfikowany na jej końcu ?? Tak będzie imo wygodniej ;) |
|
Gage Temat założony przez niniejszego użytkownika |
» 2015-04-15 16:59:53 Poprawione wygląda w następujący sposób: #include <iostream> #include <fstream>
using namespace std;
int main() { fstream plik; plik.open( "D:/asd.txt" ); if( !plik.good() ) return 0; char b; int a = plik.tellg(); while( !plik.eof() ) { plik.seekg( a ); plik.get( b ); cout << b; a = plik.tellg() + 2; } }
ale zwyczajnie nie jest w stanie odczytać co trzeciego znaku przy żadnej możliwej modyfikacji zmiennej a. Ustawione na +2, wczytuje co czwarty znak. Czuję się dosyć skonfundowany tym przykładem. Jeśli ktoś rozumie, gdzie popełniam błąd - prosiłbym o odpowiedź. Pozdrawiam! |
|
« 1 » |