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

Problem z bazą danych w C++

Ostatnio zmodyfikowano 2009-04-18 20:53
Autor Wiadomość
Wergiliusz
Temat założony przez niniejszego użytkownika
Problem z bazą danych w C++
» 2009-04-14 11:14:10
Witam. Dostałem zadanie aby napisać aplikację, która pozwala na wyświetlanie tabeli z bazy danych zawierającej następujące dane studentów:
Lp,Imie,Nazwisko,Data,Grupa,Adres,Miasto,Kod,Wojewodztwo,Telefon.

Aplikacja ma wyświetlać dane, umożliwiać głównie ich dodawanie, modyfikowanie, usuwanie, odczyt i zapis do pliku + wszystkie podobne działania jakie tylko wymyślę (typu sortowanie, wyszukiwanie, itp.).

Ogólne założenie miałem takie, że będzie plik Główny.cpp (w którym będzie obsługa całej aplikacji, czyli wszystkie buttony itd.), plik Funkcje.cpp (w którym będą funkcje typu wczytaj, zapisz, czyść tablicę, dodaj, usuń, itd...) oraz plik student.h (w którym zdefiniowana jest struktura student i zadeklarowane funkcje).

Do tej pory mam zrobione funkcje czyszczenia tablicy(czyli tej struktury) oraz wczytywanie i zapis. I tu mam problem, bo leżę na tych plikach. Mam bazę z MySQL-a, z którą program powinien być kompatybilny. Funkcje niby się kompilują (jedyne ostrzeżenia jakie pokazuje to podwójne \t\t, ale to chyba nie problem). Tyle tylko, że po wczytaniu pliku i jego zapisie zamiast tego co było pojawiają mi się wiersze cyferek. Nie wiem co robię źle, bo pierwszy raz próbuję coś tworzyć na plikach.

Kod pisałem w oparciu o aplikację kolegi, ale nic z niej nie rozumiem, bo kolega pisze 'brudne' programy (wskaźniki, multum zniennych, zero wcięć, mało komentarzy). Czy mogę prosić o pomoc w tych dwóch funkcjach?

Oto ich kod:

C/C++
void Wczytaj( void )



{ int i;
    ifstream plik; //--------------------------tylko do odczytu----------
    plik.open( "baza.txt", ios::in ); //--------------------otwarcie pliku----------
    do
    {
        if( plik.fail() ) //-----------------jeśli błąd pliku----------
        {
            plik.close(); //---------------zamknij plik----------
            return; //--------------------------zakończ----------
        }
        else //-----------------------jeśli plik jest ok----------
        {
            for( i = 0; i <= MAX; i++ )
            {
                plik.getline( tab[ i ].LP, sizeof( tab[ i ].LP ), '\t' );
                plik.getline( tab[ i ].Imie, sizeof( tab[ i ].Imie ), '\t\t' );
                plik.getline( tab[ i ].Nazwisko, sizeof( tab[ i ].Nazwisko ), '\t\t' );
                plik.getline( tab[ i ].Data, sizeof( tab[ i ].Data ), '\t\t\t' );
                plik.getline( tab[ i ].Grupa, sizeof( tab[ i ].Grupa ), '\t\t' );
                plik.getline( tab[ i ].Adres, sizeof( tab[ i ].Adres ), '\t\t' );
                plik.getline( tab[ i ].Miasto, sizeof( tab[ i ].Miasto ), '\t\t' );
                plik.getline( tab[ i ].Kod, sizeof( tab[ i ].Kod ), '\t\t' );
                plik.getline( tab[ i ].Wojewodztwo, sizeof( tab[ i ].Wojewodztwo ), '\t\t' );
                plik.getline( tab[ i ].Telefon, sizeof( tab[ i ].Telefon ), '\n' );
            }
        }
    }
    while( !plik.eof() ); //dopóki nie koniec pliku
   
    plik.close(); //zakończ pracę na pliku - zamknij
}



void Zapisz( void )
{
    int i;
    ofstream plik; //tworzenie zmiennej tylko do zapisu
    plik.open( "baza.txt", ios::out ); //otwarcie pliku
    if( plik.fail() ) //jeśli napotka błąd pliku
    {
        plik.close(); //zamknij plik
        exit( 1 ); //zakończ
    }
    //        plik.clear();
    for( i = 0; i < MAX; i++ ) //od początku tablicy do końca
    //        if(tab[i].Imie[0]!=NULL) //jeśli pierwszy element nie pusty
    {
        plik
        << tab[ i ].LP << '\t'
        << tab[ i ].Imie << '\t\t'
        << tab[ i ].Nazwisko << '\t\t'
        << tab[ i ].Data << '\t\t\t'
        << tab[ i ].Grupa << '\t\t'
        << tab[ i ].Adres << '\t\t'
        << tab[ i ].Miasto << '\t\t'
        << tab[ i ].Kod << '\t\t'
        << tab[ i ].Wojewodztwo << '\t\t'
        << tab[ i ].Telefon << '\n'
        << endl;
    }
    plik.close(); //zakończ pracę na pliku - zamknij
}

Proszę, help me, co tu jest źle? Bez tego nie mogę pisać dalej, bo jak sprawdzić dodawanie wierszy skoro nie wiem czy mi źle czyta czy źle zapisuje...

A i jeszcze funkcja do czyszczenia tablicy przed wczytaniem:

C/C++
void Tablica()
{
    for( int i = 0; i < MAX; i++ )
    {
        tab[ i ].Imie[ 0 ] = NULL;
        tab[ i ].Nazwisko[ 0 ] = NULL;
        tab[ i ].Data[ 0 ] = NULL;
        tab[ i ].Grupa[ 0 ] = NULL;
        tab[ i ].Adres[ 0 ] = NULL;
        tab[ i ].Miasto[ 0 ] = NULL;
        tab[ i ].Kod[ 0 ] = NULL;
        tab[ i ].Wojewodztwo[ 0 ] = NULL;
        tab[ i ].Telefon[ 0 ] = NULL;
       
    };
}
P-5587
DejaVu
» 2009-04-14 12:01:51
Czy Wy macie napisać program, który odczyta plik tworzony przez bazę danych czy też macie napisać program, który łączy się do bazy danych i pobiera z niego zawartość wybranej tablicy a następnie ją wypisuje?
P-5590
Wergiliusz
Temat założony przez niniejszego użytkownika
» 2009-04-14 13:11:39
Głównym założeniem jest to, że program ma pobierać dane z pliku do tablicy i tam na nich operować.Zapis do pliku ma być na wyraźne żądanie usera, czyli po kliku w button. Jeśli jest jakaś wydajniejsza opcja to jestem otwarty na propozycje :).

Tutaj jest wstępny projekt wyglądu aplikacji:
http://screeny.pl/126878

'Zapisz zmiany' ma zapisywać do pliku, 'Wczytaj bazę' ma wczytać itd...
'Dodaj wpisy' odblokowuje button 'dodaj' na dole, który powoduje dopisanie wiersza. 'Edytuj' uaktywnia niewidoczne teraz buttony 'modyfikuj' i 'usuń'.
'Przeglądaj' odblokowuje ukryte buttony 'prev' i 'next', co umożliwia wyświetlanie w lewym GroupBoxie kolejnych wpisów z bazy.
'Nowa baza' ma tworzyć nowy plik o innej nazwie niż domyślna "baza.txt", zapisać na dysku i operować na nim.
'Zapisz jako' działa podobnie, tylko zamiast tworzyć nowy pusty plik zapisuje aktualną tablicę do nowego pliku o podanej przez nas nazwie.

Dwa ostatnie chyba mówią same za siebie.

Tabelka z prawe ma wyświetlać całość tablicy na bierząco, ale to póki co dalsze założenie, chyba że można by ją wykorzystać żeby łatwiej operować na tablicy.


Tak więc plan mam, wg. mnie dość przejrzysty. Jeśli ktoś ma pomysł na szybsze/wydajniejsze działanie to chętnie przeczytam i się zastosuję.
Jedynym problemem są tylko operacje na plikach, których jeszcze nie mieliśmy omawianych (a semestr trzeba zaliczyć wcześniej bo niestety w maju wyjeżdżam).

Tak więc głównie potrzebuję pomocy w funkcjach Wczytaj() i Zapisz(), ewentualnie wskazówek ilu zmiennych używać i do czego żeby nie było ich niepotrzebnie za dużo, albo za mało.

PS. Dzięki za edycję posta. Jakich znaczników używać, żeby od razu to było jako kod?

/Pietrzuch: Artykuł o tagach przydatnych przy pisaniu postów.
/Wergiliusz dz.
P-5594
GoldWolf
» 2009-04-14 16:11:22
Mówiłem by przykleić temat o tym jak poprawie pisać posty ... czyli o wszystkich tagach...
P-5606
DejaVu
» 2009-04-14 16:33:06
Co do warningów to informują one Ciebie o tym, że zapis:
'\t\t'
jest niedozwolony - to są dwa znaki. Dozwolonym zapisem jest:
'\t'
lub w przypadku tekstu:
"\t\t"

Trzeci parametr funkcji getline(...) służy do tego, aby ustalić znak kończący wczytywanie danych (domyślnie jest to '\n').
Tak więc:
C/C++
string tekst;
getline( plik, tekst, '\t' );
Wczyta Ci z pliku wszystko od obecnego miejsca 'kursora' do napotkania znaku tabulacji.

Jeśli plik prawidłowo otworzyłeś do odczytu nie powinieneś mieć problemów z odczytaniem danych (jeśli format danych jest taki, jak sugerujesz - kolumny oddzielone znakiem tabulacji).

Przykład otwarcia pliku:
C/C++
std::fstream plik;
plik.open( "nazwapliku", std::ios::in );
if( !plik.good() ) std::cout << "otwarcie pliku nie powiodlo sie." << std::endl;
P-5608
Wergiliusz
Temat założony przez niniejszego użytkownika
» 2009-04-18 14:26:53
Dzięki za zainteresowanie, ale ja dalej tego nie ogarniam...

Zrobiłem getlinem, to mi wczytuje tylko 1 linijkę.
Zrobiłem buforem, to mi robi śmieszne cuda wianki, mianowicie wczytuje i zapisuje z drobniutką modyfikacją (nie wiem czemu :/), a jak wczytam i zapiszę po raz drugi to mi zapełnia śmieciami cały plik.

Mógłby ktoś na to popatrzeć?

Aplikacja w borlandzie:

http://odsiebie.com/pokaz/2269563---ccce.html

Działają buttony wczytaj (3 od lewej) i zapisz (2 od lewej). Jak wczytam i zapiszę 2 x pod rząd to baza idzie się paść :/. O co tu chodzi?

Z góry dzięki za pomoc i zainteresowanie.
P-5816
pixelmaster
» 2009-04-18 20:53:44
żeby getline wczyało ci więcej niż jedną linię musisz to sobie zamknąć w pentelkę
C/C++
while( getline( plik, dane ) )
{
    for( int i = 0; i < 10; i++ )
    {
        cout << "dane: " << dane << endl;
    }
}
P-5830
« 1 »
  Strona 1 z 1