Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Lekcja 32] problem z zadaniem domowym

Ostatnio zmodyfikowano 2013-08-06 14:40
Autor Wiadomość
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:

C/C++
#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?
P-76792
xReprisal
» 2013-08-06 10:20:48
Problem stwarza
} while( std::getline( plik, wiersz ) );
.
P-89580
MrPoxipol
» 2013-08-06 11:33:29
Dwa razy pobierasz linię z pliku.
P-89583
Monika90
» 2013-08-06 14:40:09
Generalnie to przetwarzanie wszystkich wierszy w pliku się robi tak:
C/C++
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:
C/C++
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
.
P-89604
« 1 »
  Strona 1 z 1