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

Odczytywanie bazy danych z pliku

Ostatnio zmodyfikowano 2011-06-13 20:48
Autor Wiadomość
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 :)
C/C++
#include <iostream>
#include <string>
#include <conio.h> // po co Ci to ?? :D
#include <fstream>
using namespace std;
struct baza
{
    string odpowiedz;
    string pytanie;
};
int main()
{
    string zmienna = " ";
    string odczyt = " ";
    fstream plik; // to też tutaj :D
    while( 1 )
    {
        plik.open( "baza.txt" ); // otwierać i zamykać musisz w pętli :)
        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; // opuszczenie pętli while - po co szukać dalej jak znaleźliśmy ?
            }
        }
        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
P-33863
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:
C/C++
int main()
{
    string zmienna = " ";
    string odczyt = " ";
    while( 1 )
    {
        fstream plik;
        ...
To jest ok, ale jeśli tak:
C/C++
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:
C/C++
#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...
P-33864
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
C/C++
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;
   
    //...
   
    // Teraz dopiero tworzysz pętlę,
    // w której odczytujesz pytania użytkownika,
    // szukasz, czy masz takowe pytanie w bazie i odpowiadasz...
}
Jakby co, to rozwiązań jest multum, nie twierdzę, że moje jest jedyne i idealne :)
P-33869
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 ;)

C/C++
dane[ 199 ].odpowiedz = dane[ i ].calosc.substr( 0, dane[ i ].calosc.find( ":" ) ); //dzielenie LINIJKI na pyt i odp
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 )
...
P-34123
1 2 3 « 4 »
Poprzednia strona Strona 4 z 4