Zadanie rozdział 35.
Ostatnio zmodyfikowano 2015-05-04 12:53
bragon91 Temat założony przez niniejszego użytkownika |
Zadanie rozdział 35. » 2015-05-01 15:02:47 Program ma wypisywać co trzeci znak z pliku i nie wiem dlaczego ale program wypisuje pierwszy znak potem przesuwa pozycje o 3 i wtedy cały czas wyświetla znak z pozycji 4. Co jest źle, bo według mnie powinien działać ale jaki widać się mylę. #include <iostream> #include <fstream>
using namespace std;
int main() { fstream plik; char znak; plik.open( "F:\\plik4.txt" ); if( !plik.good() ) cout << "Nie odczytało pliku."; while( !plik.eof() ) { plik >> znak; cout << znak << " "; plik.seekg( plik.tellg() + 4 ); } return 0; } |
|
ax3lr00d |
» 2015-05-02 13:25:55 Musisz sprawdzić, czy plik.seekg nie wychodzi poza zakres pliku. if( !plik.seekg( plik.tellg() + 4 ) ) break;
lub zmodyfikować założenia pętli while while( !plik.eof() && !plik.fail() )
|
|
bragon91 Temat założony przez niniejszego użytkownika |
» 2015-05-02 17:52:56 Wielkie dzięki już prawie działa. Jest jeszcze mały problem z tym, że wyświetla 2 razy ostatni znak, tak jakby skończył się plik ale nie przerwało pętli tylko wykonała się jeszcze raz. Jest także dziwna rzecz której nie rozumie... Już pokazuje. Plik wejściowy: 1234567890 63463h46k634hk6hke... Kod programu: #include <iostream> #include <fstream>
using namespace std;
int main() { fstream plik; char znak; plik.open( "plik4.txt" ); if( !plik.good() ) cout << "Nie odczyta³o pliku."; while( !plik.eof() && !plik.fail() ) { plik.clear(); cout << plik.tellg() << ", "; plik >> znak; cout << znak << "\n"; plik.seekg( plik.tellg() + 2 ); } return 0; } Konsola: Sprawa wygląda tak, że nie rozumiem dlaczego program gubi znaki na początku. Może zadaje głupie pytania ale niezbyt rozumiem ostatnie 2 rozdziały poziomu 4. |
|
ax3lr00d |
» 2015-05-04 12:53:21 Jeżeli chodzi o ostatni znak, to najprawdopodobniej implemetacja, którą używasz nie ustawia bitu failbit gdy seekg wyjdzie poza plik. Natomiast na pewno jest on ustawiany w momencie odczytu z pliku. Modyfikując program w ten sposób, sprawdzamy, czy nie odczytujemy poza plikiem. while( !plik.eof() && plik.good() ) { plik >> znak; if( plik.fail() ) break; cout << plik.tellg() << ", "; cout << znak << "\n"; plik.seekg( plik.tellg() + 4 ); }
Z tego co pamiętam (ale mogę się mylić) strumienie standardowo pomijają puste znaki (\n \t spacja). Można zmienić to stosując flagę noskipws czyli plik >> noskipws >> znak;
|
|
« 1 » |