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

lekcja 32 - pytanie

Ostatnio zmodyfikowano 2014-01-08 14:52
Autor Wiadomość
kleczaj
Temat założony przez niniejszego użytkownika
lekcja 32 - pytanie
» 2014-01-08 00:32:46
Zadanie domowe 32.
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.


Rozwiązałem pracę domową, ale drażni mnie jeden szczegół. Mógłby mi ktoś podpowiedzieć jak zrobić żeby komunikat o tym, że nie znaleziono w tekście danego słowa wyświetlał się tylko raz a nie tyle razy ile jest linijek tekstu? Oto mój kod:

C/C++
#include <string>
#include <iostream>
#include <fstream>

void szukajWszystkichFraz( std::string & tekst, std::string szukanaFraza )
{
    size_t znalezionaPozycja = tekst.find( szukanaFraza );
   
    if( znalezionaPozycja != std::string::npos )
         std::cout << tekst << std::endl;
    else
         std::cout << "nie znaleziono" << std::endl;
   
}

bool wczytajPlik( std::string nazwaPliku )
{
    std::ifstream plik;
    plik.open( nazwaPliku.c_str() );
    if( !plik.good() )
         return false;
   
    while( plik.good() )
    {
        std::cout << "Podaj tekst ktory chcesz wyszukac\n";
        std::string a;
        std::cin >> a;
        std::string wiersz;
        while( std::getline( plik, wiersz ) )
             szukajWszystkichFraz( wiersz, a );
       
    } return true;
}

int main()
{
    if( wczytajPlik( "C:/odczyt.txt" ) != 1 )
         std::cout << "Nie udalo sie otworzyc pliku!" << std::endl;
   
    return 0;
}
P-101556
alixir
» 2014-01-08 07:30:10
Najprościej usuń kawałek kodu:

C/C++
else
     std::cout << "nie znaleziono" << std::endl;


Oczywiście wtedy komunikat nie pojawi się ani razu, ale wydaje mi się że nie było takiego założenia w treści zadania.

A jeśli chciałbyś to przerobić, to można zamierzony cel osiągnąć np. tak:

C/C++
#include <string>
#include <iostream>
#include <fstream>

bool szukajWszystkichFraz( std::string & tekst, std::string szukanaFraza )
{
    size_t znalezionaPozycja = tekst.find( szukanaFraza );
   
    if( znalezionaPozycja != std::string::npos )
         return true;
    else
         return false;
   
}

bool wczytajPlik( std::string nazwaPliku )
{
    bool znaleziono = false;
    std::ifstream plik;
    plik.open( nazwaPliku.c_str() );
    if( !plik.good() )
         return false;
   
    while( plik.good() )
    {
        std::cout << "Podaj tekst ktory chcesz wyszukac\n";
        std::string a;
        std::cin >> a;
        std::string wiersz;
        while( std::getline( plik, wiersz ) )
        if( szukajWszystkichFraz( wiersz, a ) ) {
            std::cout << wiersz << std::endl;
            znaleziono = true;
        }
    }
   
    if( !znaleziono )
         std::cout << "Nie znaleziono" << std::endl;
   
    plik.close();
   
    return true;
}

int main()
{
    if( wczytajPlik( "odczyt.txt" ) != 1 )
         std::cout << "Nie udalo sie otworzyc pliku!" << std::endl;
   
    return 0;
}
P-101560
kleczaj
Temat założony przez niniejszego użytkownika
» 2014-01-08 14:52:36
Jest tak jak potrzebowałem. Dziękuje za pomoc ;)
P-101585
« 1 »
  Strona 1 z 1