Odczytywanie bazy danych z pliku
Ostatnio zmodyfikowano 2011-06-13 20:48
Mrowqa |
» 2011-06-04 21:05:35 Definiowanie - fstream też umieść przed while :) Plik musisz otwierać i zamykać w pętli while - by dobrze Ci czytało :) #include <iostream> #include <string> #include <conio.h> #include <fstream> using namespace std; struct baza { string odpowiedz; string pytanie; }; int main() { string zmienna = " "; string odczyt = " "; fstream plik; while( 1 ) { plik.open( "baza.txt" ); struct baza dane; cout << "->"; getline( cin, zmienna ); dane.pytanie = zmienna; while( getline( plik, odczyt ) ) { if( odczyt == dane.pytanie ) { getline( plik, odczyt ); cout << odczyt << endl; break; } } plik.close(); } }
Mógłbyś zrobić wypis czegoś jak nie znajdzie, a szukanie zamiast ciągle otwierać i zamykać plik to wczytać do tablicy string :) Tak to w trakcie wykonywania programu możesz modyfikować plik - inna odpowiedź na to samo :) Sprawdź czy to wyżej działa :D Pozdrawiam, Mrowqa |
|
CTRL85 Temat założony przez niniejszego użytkownika |
» 2011-06-04 21:29:53 Działa. Znalazłem jeszcze jeden błąd - jeśli wpisze coś, czego nie ma w bazie - to nic już nie znajduje :( Taki luźny pomysł - dodanie pętli "for", np: for(int i = 0; i <= [ilość linii kodu]; i++) i jeśli nie znajdzie, to mówi, że nie wie o co chodzi. Z wykonaniem nie ma problemy, ale nie wiem jak pobrać ilość linii kodu :( EDIT Jeśli jest tak: int main() { string zmienna = " "; string odczyt = " "; while( 1 ) { fstream plik; ...
To jest ok, ale jeśli tak: int main() { string zmienna = " "; string odczyt = " "; fstream plik; while( 1 ) { fstream plik; ...
To już jest źle, bo jeśli wpisze coś źle, albo nie w takiej kolejności, jak w bazie, to już nie wyszukuje Tutaj jest kod z błędem, jeśli nie znajdzie w bazie: #include <iostream> #include <string> #include <fstream> using namespace std; struct baza { string odpowiedz; string pytanie; }; int main() { string zmienna = " "; string odczyt = " "; while( 1 ) { bool czy_jest = false; fstream plik; plik.open( "baza.txt" ); struct baza dane; cout << "->>"; getline( cin, zmienna ); dane.pytanie = zmienna; while( getline( plik, odczyt ) ) { if( odczyt == dane.pytanie ) { czy_jest = true; getline( plik, odczyt ); cout << odczyt << endl; break; } } if( czy_jest == false ) { cout << "Niestety nie wiem o co Ci chodzi!" << endl; } plik.close(); } } Jeszcze zostaje sprawa kilku kwestii w jednej linijce... odpowiedź raczej zrobię, ale nie wiem jak z tym co ktoś mówi... |
|
malan |
» 2011-06-04 22:39:38 Nie rozumiem co Ty chcesz osiągnąć. Na początku myślałem, że masz zamiar napisać program, który będzie odpowiadał na dane pytanie losową odpowiedzią z bazy. Potem, że piszesz aplikacje, która na konkretne pytanie odpowiada konkretną odpowiedzią. Dziś... już sam nie wiem :) Tak, czy owak, to Twoje rozwiązanie (moim zdaniem) nie jest dobre. Jak już mówiłem - nie powinieneś otwierać pliku w pętli. Pobierz dane z pliku przed pętlą, zaraz po starcie programu. Przykładowa baza danych: Siema;Witaj :) Jaka na dziś pogoda?;Deszczowo i sucho Ile masz lat?;Kobiet nie pyta się o wiek dupku! Jak masz na imię?;Chciałbyś wiedzieć. Podasz mi swój numer telefonu?;112
struct Package { std::string answer; std::string question; };
class PackageManager { public: bool readFromDatabase( const char * dbFileName ) { std::ifstream db( dbFileName ); Package temporary; getline( db, temporary.question, ';' ); getline( db, temporary.answer ); packages.push_back( temporary ); return true; } private: std::vector < Package > packages; };
int main() { PackageManager packages; if( !packages.read( "db.txt" ) ) return 1; } Jakby co, to rozwiązań jest multum, nie twierdzę, że moje jest jedyne i idealne :) |
|
CTRL85 Temat założony przez niniejszego użytkownika |
» 2011-06-13 20:48:26 Poradziłem Sobie z tym dopiero wczoraj wieczorem - wszystko super gra, ale chciałbym zrobić coś takiego: [pytanie1]|[pytanie2]|[pytanie n]:odpowiedz np elo|siema|witaj:czesc mój kod: http://wklej.org/id/546037/ wiem jak podzielić, ale albo dziele, zeby pierwszą część barało, albo ostatnią, no i jeszcze problem, jak bedzie >2 możliwości... Zrobiłem coś takiego, choć to dość dziwne rozwiązanie ;) dane[ 199 ].odpowiedz = dane[ i ].calosc.substr( 0, dane[ i ].calosc.find( ":" ) ); string zmienna = dane[ 199 ].odpowiedz.substr( 0, dane[ 199 ].odpowiedz.find( "|" ) ); string zmienna2 = dane[ 199 ].odpowiedz.substr( dane[ 199 ].odpowiedz.find( "|" ) + 1 ); while( dane[ 199 ].pytanie == dane[ 199 ].odpowiedz || zmienna == dane[ 199 ].pytanie || zmienna2 == dane[ 199 ].pytanie ) ...
|
|
1 2 3 « 4 » |