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ść
CTRL85
Temat założony przez niniejszego użytkownika
» 2011-06-03 17:35:02
kod:
C/C++
#include <iostream>
#include <string>
#include <conio.h>
#include <fstream>
using namespace std;
struct baza
{
    string odpowiedz;
    string pytanie;
};

int main()
{
    while( 1 )
    {
        struct baza dane;
        string zmienna;
        string odczyt;
        cout << "->";
        getline( cin, zmienna );
        dane.pytanie = zmienna;
        fstream plik;
        plik.open( "baza.txt" );
        while( getline( plik, odczyt ) )
        {
            dane.odpowiedz = odczyt;
        }
        cout << dane.odpowiedz << endl;
    }
}

umieściłem na klej.org, bo zazwyczaj za wklejenie kodu bezpoś. do posta móna dostać warna :)
P-33805
Mrowqa
» 2011-06-03 17:44:16
Kod otaguj [cpp][/cpp]
C/C++
fstream plik;
plik.open( "baza.txt" ); // tryb otwarcia ??
while( getline( plik, odczyt ) )
{
    dane.odpowiedz = odczyt;
}
cout << dane.odpowiedz << endl;
// a gdzie zamknięcie strumienia ??
Tyle na pierwszy rzut oka :)

Zmienne definiowane w pętli z każdym jej obiegiem są niszczone, a potem tworzone od nowa inne obiekty !! ( w sensie podczas kolejnego obiegu pętli )

Pozdrawiam,
Mrowqa
P-33807
CTRL85
Temat założony przez niniejszego użytkownika
» 2011-06-03 18:29:21
Nadal odpowiada ostatnią linijką :(
P-33808
Mrowqa
» 2011-06-03 19:15:53
No to czego się spodziewałeś ??
C/C++
while( getline( plik, odczyt ) ) // wczytuj dopóki się da coś jeszcze wczytać
{
    dane.odpowiedz = odczyt; // zapisz to do odpowiedzi ( czyli ostatnia odpowiedź )
}
cout << dane.odpowiedz << endl; // i ją wypowiedz :)
Szkoda słów na ten temat ...

Możesz sobie zapisywać do dynamicznie zaalokowanej tablicy stringów i losowy wypisać, albo np. przerobić tak zapis:
C/C++
if( rand % 10 < 3 ) // dla przykładu 30% :)
     dane.odpowiedz = odczyt; // ten if to w pętli while
// przed wypisem:
if( dane.odpowiedz.empty() ) dane.odpowiedz = "twoja awaryjna odpowiedz :P";

Oczywiście ta szansa to 30$ na ostatnią, więc jeśli masz np. 100 odpowiedzi więc lepszy były np. 2% :D

Pozdrawiam,
Mrowqa
P-33810
absflg
» 2011-06-03 23:47:08
Twój program pobiera pytanie od użytkownika, wypisuje '->' po czym wkleja ostatni wiersz pliku (zapisuje każdy wiersz w dane.odpowiedz, więc po wykonaniu pętli będzie w nim ostatnia wartość). Jak chcesz, żeby wklejało odpowiednią odpowiedź to napisz, żeby to robiło. Żadna magia tu nie zadziała.

Dostałeś na prośbę o pomoc dwa warianty wykonania, których nie wykorzystałeś. Po co trwonisz cudzy czas? :]
P-33815
CTRL85
Temat założony przez niniejszego użytkownika
» 2011-06-04 19:49:21
C/C++
#include <iostream>
#include <string>
#include <conio.h>
#include <fstream>
using namespace std;
struct baza
{
    string odpowiedz;
    string pytanie;
};
int main()
{
    srand(( int ) time( NULL ) );
    while( 1 )
    {
        fstream plik;
        plik.open( "baza.txt" );
        struct baza dane;
        string zmienna = " ";
        string odczyt = " ";
        cout << "->";
        getline( cin, zmienna );
        dane.pytanie = zmienna;
        while( getline( plik, odczyt ) )
        {
            if( odczyt == dane.pytanie )
            {
                getline( plik, odczyt );
                cout << odczyt << endl;
            }
        }
        if( dane.odpowiedz.empty() ) //to chyba nie potrzebne?
        {
            dane.odpowiedz = "Niestety nie wiem o co Ci chodzi";
        }
        plik.close();
    }
}

Mam takie coś i (o dziwo) działa, ale ma 2 poważne mankamenty:
1. może być 1 słowo w jednej linijce (jedna odpowiedz, jedno pytanie)
2. Jeżli nie znalazło w bazie to po prostu nic nie odpowiada - przydała by się informacja

Ale mimo tego ciesze sie ze coś wykombinowałem :D
No i jeszcze pokombinuje, żeby dało sie po kilka odpowiedzi i pytań w linijce.
P-33855
Mrowqa
» 2011-06-04 20:24:11
2. Jeżli nie znalazło w bazie to po prostu nic nie odpowiada - przydała by się informacja
C/C++
if( dane.odpowiedz.empty() ) // rownoznaczne z dane.odpowiedz == "" - czyli sprawdza czy pusty :)
{
    dane.odpowiedz = "Niestety nie wiem o co Ci chodzi"; // czyli to ta twoja informacja :P
}
To wyżej masz :)
Jak wcześniej mówiłem - polecam zdefiniować obiekty przed pętla ( i jak chcesz to tam otworzyć plik, a za pętlą zamknąć :D ).

Pozdrawiam,
Mrowqa
P-33858
CTRL85
Temat założony przez niniejszego użytkownika
» 2011-06-04 20:51:26
Tylko jak jest tak:
C/C++
#include <iostream>
#include <string>
#include <conio.h>
#include <fstream>
using namespace std;
struct baza
{
    string odpowiedz;
    string pytanie;
};
int main()
{
    fstream plik;
    plik.open( "baza.txt" );
    while( 1 )
    {
        struct baza dane;
        string zmienna = " ";
        string odczyt = " ";
        cout << "->";
        getline( cin, zmienna );
        dane.pytanie = zmienna;
        while( getline( plik, odczyt ) )
        {
            if( odczyt == dane.pytanie )
            {
                getline( plik, odczyt );
                cout << odczyt << endl;
            }
        }
        if( dane.odpowiedz.empty() ) //to chyba nie potrzebne?
        {
            dane.odpowiedz = "Niestety nie wiem o co Ci chodzi";
        }
    }
    plik.close();
}

To źle wyszukuje, bo (załóżmy, że w pliku jest:
czesc
siema
nara
papa)

To jak wpisze czesc - wszystko ok, jak wpisze nara - ok, ale jeśli jeszcze raz wpisze "czesc" to już nie czyta :/

Definiowanie zmiennych - o coś takiego chodziło?
C/C++
#include <iostream>
#include <string>
#include <conio.h>
#include <fstream>
using namespace std;
struct baza
{
    string odpowiedz;
    string pytanie;
};
int main()
{
    string zmienna = " ";
    string odczyt = " ";
    while( 1 )
    {
        fstream plik;
        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;
            }
        }
        plik.close();
    }
}
P-33862
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona