[Lekcja 32] problem z zadaniem domowym
Ostatnio zmodyfikowano 2013-08-06 14:40
firefighterkasa Temat założony przez niniejszego użytkownika |
[Lekcja 32] problem z zadaniem domowym » 2013-02-23 14:28:20 Witam, zmodyfikowałem podany w lekcji program do wyświetlania zawartości pliku tekstowego aby wyświetlał tylko te wiersze, w których znajduje się podane przez użytkownika słowo. Kod: #include <fstream> #include <iostream>
bool wyswietlZawartoscPliku( std::string sNazwaPliku, std::string slowo ) { size_t znalezionaPozycja; std::ifstream plik; plik.open( sNazwaPliku.c_str() ); if( !plik.good() ) return false; std::string wiersz; int i = 1; do { std::cin.clear(); std::cin.sync(); std::cout << "Petla nr: " << i << std::endl; std::getline( plik, wiersz ); size_t znalezionaPozycja = wiersz.find( slowo ); if( znalezionaPozycja != std::string::npos ) { std::cout << "Znalazlem wiersz z szukanym slowem, wiersz nr " << i << std::endl; std::cout << "Slowo znajduje sie na pozycji: " << znalezionaPozycja << std::endl; std::cout << wiersz << std::endl; } i++; } while( std::getline( plik, wiersz ) ); plik.close(); return true; }
int main() { std::string wyraz; std::cout << "Podaj wyraz" << std::endl; std::getline( std::cin, wyraz ); std::cout << "Podales wyraz " << wyraz << std::endl; if( !wyswietlZawartoscPliku( "cpp0x.txt", wyraz ) ) std::cout << "Nie udalo sie otworzyc pliku o podanej nazwie." << std::endl; return 0; } Dla podanego w lekcji piku cpp0x.txt nie do końca działa on poprawnie. Przykładowo wypisuje poprawnie wiersze z podanym słowem "Kurs": Podaj wyraz Kurs Podales wyraz Kurs Petla nr: 1 Znalazlem wiersz z szukanym slowem, wiersz nr 1 Slowo znajduje sie na pozycji: 6 --==[ Kurs C++ | http://cpp0x.pl ]==-- Petla nr: 2 Znalazlem wiersz z szukanym slowem, wiersz nr 2 Slowo znajduje sie na pozycji: 22 http://cpp0x.pl/kursy/Kurs-C++/Poziom-4/Wczytywanie-tekstu-z-pliku/355 Petla nr: 3 Petla nr: 4
Process returned 0 (0x0) execution time : 4.531 s Press any key to continue. Ale dla słowa np plik wynik programu jest nieprawidłowy: Podaj wyraz plik Podales wyraz plik Petla nr: 1 Petla nr: 2 Znalazlem wiersz z szukanym slowem, wiersz nr 2 Slowo znajduje sie na pozycji: 61 http://cpp0x.pl/kursy/Kurs-C++/Poziom-4/Wczytywanie-tekstu-z-pliku/355 Petla nr: 3 Petla nr: 4
Process returned 0 (0x0) execution time : 3.266 s Press any key to continue. ponieważ wyraz plik znajduje się także w 4 wierszu przeszukiwanego liku tekstowego. Plik tekstowy cpp0x.txt zawiera tekst następujący: --==[ Kurs C++ | http://cpp0x.pl ]==-- Obecnie uczysz sie obslugi plikow. Link do czytanego rozdzialu: http://cpp0x.pl/kursy/Kurs-C++/Poziom-4/Wczytywanie-tekstu-z-pliku/355 Udalo Ci sie odczytac plik?
Wykonaj teraz prace domowa ze wspomnianego rozdzialu! :) Proszę o pomoc dlaczego tak się dzieje? |
|
xReprisal |
» 2013-08-06 10:20:48 Problem stwarza } while( std::getline( plik, wiersz ) ); . |
|
MrPoxipol |
» 2013-08-06 11:33:29 Dwa razy pobierasz linię z pliku. |
|
Monika90 |
» 2013-08-06 14:40:09 Generalnie to przetwarzanie wszystkich wierszy w pliku się robi tak: while( std::getline( plik, wiersz ) ) { rob_cos_z( wiersz ); }
Po wyjściu z pętli można ewentualnie zbadać flagi pliku, żeby wiedzieć jaki był powód wyjścia z pętli (koniec pliku czy błąd odczytu). Niektórzy piszą to tak: for( std::string wiersz; std::getline( plik, wiersz ); ) { rob_cos_z( wiersz ); }
Mnie akurat się taki styl nie podoba, ale można i tak. Zwróć uwagę, ze w ciałach tych pętli nie ma czegoś takiego jak plik.clear(); plik.sync(); , gdyż nie jest to do niczego potrzebne. A u Ciebie jest std::cin.clear(); std::cin.sync(); , co tym bardziej nie ma sensu, bo std::cin to jest inny strumień niż plik . |
|
« 1 » |