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

Rozdział 32. Zadanie domowe

Ostatnio zmodyfikowano 2016-01-10 22:31
Autor Wiadomość
fearlay
Temat założony przez niniejszego użytkownika
Rozdział 32. Zadanie domowe
» 2016-01-10 21:56:26
Cześć, zrobiłem zadanie domowe z rozdziału 32. jednak nie jestem zadowolony ze sposobu wykonania. Niestety nie znalazłem lepszego rozwiązania...

Treść: Napisz program, który odczyta zawartość pliku, a następnie wypisze na ekranie tylko te wiersze, w których znajduje się wyraz wprowadzony przez użytkownika.

Mój kod:
C/C++
#include <iostream>
#include <fstream>
#include <string>

bool wyswietlZawartoscPliku( std::string sNazwaPliku, std::string SzukanaFraza )
{
    std::ifstream plik;
    plik.open( sNazwaPliku.c_str() );
    if( !plik.good() )
         return false;
   
    std::string wiersz;
    int i = 1;
   
    while( std::getline( plik, wiersz ) )
    {
        size_t znalezionaPozycja = wiersz.find( SzukanaFraza );
        if( znalezionaPozycja > 500 )
             std::cout << i << ". Brak" << std::endl;
        else
             std::cout << i << ". " << wiersz << std::endl;
       
        i++;
       
    }
   
    plik.close();
    return true;
}


int main()
{
    std::string SzukanaFraza;
    std::cin >> SzukanaFraza;
    if( !wyswietlZawartoscPliku( "moje.txt", SzukanaFraza ) )
         std::cout << "Nie udalo sie otworzyc pliku o podanej nazwie." << std::endl;
   
    return 0;
}

Przykładowy log z programu:

Huawei
1. Huawei Ascend P7 is company's premium handset launched in June 2014.
2. Brak
3. Premium Flagship of the company Huawei, providing just one upgrade
4. Brak
5. still Huawei didn't put it in the list that they will upgrade.
6. Brak
7. So we are requesting to put the Huawei Ascend P7 among the list they will upgrade to Marshmallow.

Dlaczego jestem niezadowolony? Otóż odkryłem, że jak dane słowo nie występuje w wierszu, to zmienna typu size_t znalezionaPozycja przyjmuje wartość dokładnie 4294967295. Nie wiem w sumie dlaczego, ale tak jest. Zatem za każdym razem sprawdzam czy znalezionaPozycja jest większa niż np. 500 (generalnie więcej niż posiada wiersz). Przyznam szczerze, że niezbyt podoba mi się ten pomysł... Czy ktoś może naprowadzić na coś lepszego? Dlaczego jak podana fraza nie występuje w wierszu to znalezionaPozycja przyjmuje taką kosmiczną wielkość? Czy tak jest za każdym razem?

Pozdrawiam :)
P-143351
mateczek
» 2016-01-10 22:31:40
if( znalezionaPozycja != string::npos) // jak ma być ładniej to w tym stylu
P-143358
« 1 »
  Strona 1 z 1