Przeszukiwanie pliku na podstawie podanego slowa

0

Witam! W internecie jest wiele podobnych tematów jednak żaden nie spełnia moich wymagań :). Otóż mam problem, ponieważ muszę napisać program, który prosi o podanie pewnych danych od użytkownika, a potem zapisuje te dane w pliku .txt wiersz po wierszu. Problem pojawia się jednak przy dodaniu funkcji do programu aby na podstawie podanego słowa wyszukał i wyświetlił wszystkie wiersze które zawierają dane słowo. Czyli, jest program, który zapisuje dane o osobach do pliku a następnie trzeba wyszukać wszystkie osoby o imieniu np. Kasia :). Jak to zrobić? Czytałem o wielu funkcjach ale nadal nie wiem jak tego użyć w sposób opisany powyżej. Z góry dzięki ;)

0

Odczytujesz plik rekord po rekordzie, imię porównujesz z podanym imieniem, jeżeli takie samo to wyświetlasz cały wiersz.
Więcej nic nie da się powiedzieć dopóki nie pokażesz tego co już zrobiłeś.

0
Pacjent pacjent;
fstream plik_szukaj;
plik_szukaj.open( "plik_szukaj.txt", ios::out | ios::app | ios::in);
cout << "Podaj plec pacjenta (K/M): ";
	cin >> pacjent.sex;
	plik_szukaj << pacjent.sex << "\t";
	
	cout << "Podaj imie pacjenta: ";
	cin >> pacjent.name;
	plik_szukaj << pacjent.name << "\t";
	
	cout << "Podaj nazwisko pacjenta: ";
	cin >> pacjent.surname;
	plik_szukaj << pacjent.surname << "\t";
	
	cout << "Podaj wiek pacjenta: ";
	cin >> pacjent.age;
	plik_szukaj << pacjent.age << "\t";
	
	cout << "Podaj chorobe pacjenta: ";
	cin >> pacjent.disease;
	plik_szukaj << pacjent.disease << endl;

Mam zrobioną klasę Pacjent. No i jak użytkownik poda te dane to one są dopisywane do pliku plik_szukaj.txt. A teraz chodzi mi o dodanie funkcji która działałaby w ten sposób:

  1. Program prosi o podanie frazy
  2. Podaje frazę
  3. Program wyświetla wszystkie wiersze zawierające tą frazę w pliku plik_szukaj.txt

Umiem zrobić żeby w konsoli wyświetliło całą zawartość pliku ale nie wiem jak zrobić właśnie to wyszukiwanie.

0
_13th_Dragon napisał(a):

Odczytujesz plik rekord po rekordzie, imię porównujesz z podanym imieniem, jeżeli takie samo to wyświetlasz cały wiersz.

No właśnie to wiem, ale nie wiem jak to zapisać w programie :P

0

Miałeś podać to co zrobiłeś a nie tylko fragment kodu.
Zrób wczytanie rekordu do pliku.
może zadziałać tak: plik_czytaj>>pacjent.sex>>pacjent.name>>pacjent.surname>>pacjent.age>>pacjent.disease>>ws;
Ale nie koniecznie bo podałeś zbyt mało kodu.

0
/*Program symulujący bazę chorych
zapisujący wprowadzone dane do pliku*/


//Dołączenie potrzebnych bibliotek
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <conio.h>

//W programie wykorzystywana jest przestrzeń nazw 'std'. To polecenie oszczędzi nam ciągłego wpisywania 'std'
using namespace std;

/*Funkcja 'fstream' pozwala na stworzenie i operacje na plikach
Ponizej utworzony plik bedzie uzywany w calym programie dlatego utworzony jest na samym poczatku*/
fstream outputFile;

/*Plik 'plik_szukaj' zostal utworzony zeby ulatwic wyszukiwanie danych.
Dane ktore uzytkownik wpisze zostana wpisane rowniz tutaj. Gdzy uzytkownik
bedzie chcial wyszukac pacjenta program przeszuka ten plik*/
fstream plik_szukaj;

//Klasa 'Osoba' która okresla podstawowe dane czlowieka
class Osoba
{
	public:
		string sex;
		string name;
		string surname;
		int age;
};

/*Klasa 'Pacjent' charakteryzuje konkretnego pacjenta, ktory na cos choruje.
Dziedziczy ona po klasie 'Osoba' dane takie jak wiek czy plec oraz ma wlasną daną- chorobę (ang. disease)*/
class Pacjent : public Osoba
{
	public:
		string disease;
};

//Funkcja zapisujaca dane do pliku przyjmujaca parametr typu 'Pacjent'
int Write(Pacjent pacjent)
{
	//Pobieranie danych od uzytkownika o pacjentach oraz zapisanie do pliku 'outputFile' utworzonego na poczatku programu oraz do pliku 'plik_szukaj'
	//Jako ze pobierane dane to pojedyncze slowa mozna je wczytywac za pomoca polecenia 'cin'
	cout << "Podaj plec pacjenta (K/M): ";
	cin >> pacjent.sex;
	outputFile << pacjent.sex << "\t";
	plik_szukaj << pacjent.sex << "\t";
	
	cout << "Podaj imie pacjenta: ";
	cin >> pacjent.name;
	outputFile << pacjent.name << "\t";
	plik_szukaj << pacjent.name << "\t";
	
	cout << "Podaj nazwisko pacjenta: ";
	cin >> pacjent.surname;
	outputFile << pacjent.surname << "\t";
	plik_szukaj << pacjent.surname << "\t";
	
	cout << "Podaj wiek pacjenta: ";
	cin >> pacjent.age;
	outputFile << pacjent.age << "\t";
	plik_szukaj << pacjent.age << "\t";
	
	cout << "Podaj chorobe pacjenta: ";
	cin >> pacjent.disease;
	outputFile << pacjent.disease << endl;
	plik_szukaj << pacjent.disease << endl;
	
	//Zmienna tn dzieki ktorej uzytkownik moze zadecydowac czy chce wpisac wiecej pacjentow czy nie
	string tn;
	
	cout << "Chcesz wpisac wiecej pacjentow? (t/n): ";
	cin >> tn;
	
	//Jesli uzytkownik wpisze litere 't' program wyczysci ekran systemowym poleceniem 'cls' oraz jeszcze raz wykona funkcję Write()
	if(tn == "t")
	{
		system("cls");
		Write(pacjent);
	}
	//Jesli zas uzytkownik wpisze litere 'n' to program zakonczy dzialanie
	else if(tn == "n")
	{
		//Funkcja glowna ma typ 'int' dlatego musi zwracac jakas wartosc, np 0
		return 0;
	}
	//A jesli uzytkownik wpisze inny znak program go o tym powidomi i sie zamknie
	else
	{
		cout << "Wpisales zly znak: ";
		cin >> tn;
	}
}
 //Funkcja wyswietlajaca wszystkie wiersze pliku
void List()
{
	if( plik_szukaj.good() )
	{
		string napis;
		cout << "Wynik wyszukiwania:" << endl;
		while(!plik_szukaj.eof())
		{
			getline(plik_szukaj, napis);
	    	cout << napis << endl;
  	    }
  	    plik_szukaj.close();
	}
	else cout << "Nie udalo otworzyc sie pliku!" << endl;	
	
}

//Funkcja główna programu
int main()
{
	//Tworzenie pliku wyjsciowego, w ktorym beda zapisywane dane. Opcje po przecinku zezwalają na odczyt, zapis i dopisywanie danyc do pliku
	outputFile.open("baza_chorych.xls", ios::out | ios::app | ios::in);
	
	/*Do pliku ponizej zapisywane beda dane pacjentow, aby potem je mozna bylo wyszukac
	Bowiem z pliku Excelowego nie mozna odczytac danych poniewaz na ekran wyswietlane zostaja kody kratek itp, a z pliku txt czyta normalnie
	plik .xls jest natomiast czytelniejszy.*/
	plik_szukaj.open( "plik_szukaj.txt", ios::out | ios::app | ios::in);
	
	//Tworzenie 'interfejsu graficznego' tak zeby plik 'ladnei' wygladal
	outputFile << "=========================================" << endl;
	outputFile << " Plec\tImie\tNazwisko\tWiek\tChoroba" << endl;
	outputFile << "=========================================" << endl;
	
	//Deklaracja przykladowego obiektu klasy 'Pacjent'- JanKowalski
	Pacjent JanKowalski;
	
	//Deklaracja zmiennej pozwalajacej na wybor opcji
	int menu;
	
	//Tytuł oraz instrukcja dla użytkownika jak ma korzystać z programu
	cout << "\n\t\t\t\tBaza chorych\n\n" << endl;
	cout << "Witaj! Wybierz odpowiednia opcje i zacznij prace z programem. Zycze milej pracy.\n" << endl;
	cout << "[1] Dodaj pacjenta" << endl;
	cout << "[2] Wyszukaj pacjenta" << endl;
	cout << "Co chcesz robic?: ";
	cin >> menu;
	
	switch(menu)
	{
		case 1:
			Write(JanKowalski);
			break;
		case 2:
			List();
			break;
		default:
			cout << "Wpisales zly znak.";
			break;
	}
}

To jest cały kod programu. To dziedziczenie wiem, że nie jest potrzebne ale tak ma być bo nie piszę tego dla siebie. I teraz bym chciał żeby była jeszcze funkcja np.Read() która by wyszukiwała wszystkie wiersze na podstawie wpisanego słowa ;)

0
  1. Wywal to wszystko
  2. Przeczytaj pierwszy lepszy kurs jaki znajdziesz w sieci
  3. Zacznij od początku
0

I użyj do tego bazy danych. Chociażby SQLite.

1 użytkowników online, w tym zalogowanych: 0, gości: 1