Baza danych na listach wczytywanie z pliku

0

Witam. Mam do napisania prostą bazę danych na listach. Dane wczytywane są z pliku.

[code]
struct znajomi
{
int numer;
char imie[MAXIMIE];
char nazwisko[MAXNAZWISKO];
char telefon[MAXTELEFON];
char mail[MAXMAIL];
char pesel[MAXPESEL];
char data[MAXDATA];
char plec[MAXPLEC];
struct znajomi * nast;
};
[/code]

tak wygląda struktura

ma ona dane wczytać z pliku a wczytanie wygląda następująco:

[code]
FILE * odczyt;
odczyt = fopen ("znajomi.txt", "r");
biezacy = (struct znajomi *) malloc(sizeof(struct znajomi));
while((fscanf(odczyt, "%s", &biezacy -> imie)) != EOF)
{
if(glowny == NULL)
glowny = biezacy;
biezacy -> nast = NULL;
biezacy -> numer = licznik_zap + 1;
fscanf(odczyt, "%s", &biezacy -> nazwisko);
fscanf(odczyt, "%s", &biezacy -> telefon);
fscanf(odczyt, "%s", &biezacy -> mail);
fscanf(odczyt, "%s", &biezacy -> pesel);
fscanf(odczyt, "%s", &biezacy -> data);
fscanf(odczyt, "%s", &biezacy -> plec);
licznik_zap++;
biezacy -> nast = (struct znajomi *) malloc(sizeof(struct znajomi));
biezacy = biezacy -> nast;

}

[/code]

i teraz mam pytanie. Przy wypisaniu struktury tworzy mi dodatkowy element jeden. Jak zrobić by on nie powstawał?

0

ok nie to nie mam jednak inne pytanie

[code]
biezacy = glowny;
FILE * wpisz;
wpisz = fopen ("znajomi.txt", "w");
while(biezacy != NULL)
{
if(glowny == NULL)

        glowny = biezacy;
    //biezacy -> nast = NULL;
            fprintf(wpisz, "\n%s\n%s\n%s\n%s\n%s\n%s",
            biezacy -> imie, biezacy -> nazwisko, biezacy -> telefon,
            biezacy -> mail, biezacy -> pesel, biezacy -> data);
    biezacy = biezacy -> nast;
    fclose(wpisz);
    }

[/code]

mam taki kod i niestety do pliku zapisuje mi on wszystkie człony poza data urodzenia. Dla ostatniego znajomego ta data urodzenia jest zaipsana

[code]
void wczytaj(int licznik)
{
int i, plec;

FILE * wpisz;
wpisz = fopen ("znajomi.txt", "a");
biezacy  = (struct znajomi *) malloc(sizeof(struct znajomi));
if(glowny == NULL)
    glowny = biezacy;
biezacy -> nast = NULL;
    system("cls");
    printf("Podaj dane dla %d znajomego lub wcisnij zero albo enter na poczatku linii by zakonczyc\n\n", licznik + 1);
    do{
        printf("Podaj imie: ");
        gets(biezacy -> imie);
    }while(!(format_imie(biezacy -> imie)));

    if(format_imie(biezacy -> imie) == 2)
    {
        system("cls");
        menu_powrot();
    }


    do{
        printf("Podaj nazwisko: ");
        gets(biezacy -> nazwisko);
    }while(!(format_nazwisko(biezacy -> nazwisko)));
    do{
        printf("Podaj telefon: ");
        gets(biezacy -> telefon);
    }while(!format_telefon(biezacy -> telefon));
    do{
        printf("Podaj mail: ");
        gets(biezacy -> mail);
    }while(!(format_mail(biezacy -> mail)));
    do{
        printf("Podaj PESEL: ");
        gets(biezacy -> pesel);
    }while(!(format_pesel(biezacy -> pesel)));
    do{
        printf("Podaj date urodzenia(dd.mm.rrrr): ");
        gets(biezacy -> data);
    }while(!(format_data(biezacy -> data, biezacy -> pesel)));
    do{
        printf("Podaj plec (0 - K 1 - M): ");
       scanf("%d", &plec);
    }while(!(format_plec(plec, biezacy -> pesel)));

   fprintf(wpisz, "\n%s\n%s\n%s\n%s\n%s\n%s",
            biezacy -> imie, biezacy -> nazwisko, biezacy -> telefon,
            biezacy -> mail, biezacy -> pesel, biezacy -> data);

fclose(wpisz);
main ();

}[/code]

tak wyglada dodanie nowego znajomego do bazy, gdy dodam znajomego to przy wypisaniu listy znajomych czy tez przy wypisaniu calej bazy wypisuje ja dwukrotnie...

[code]
void lista_im_naz(int licznik)
{
biezacy = glowny;
while(biezacy != NULL)
{
printf("%d. %s %s\n", biezacy -> numer, biezacy -> imie, biezacy -> nazwisko);
biezacy = biezacy -> nast;
}
}[/code]

Tak wyglada wypisanie listy
Czy jest ktos w stanie pomoc?

i oczywiście wiem że gets jest zły jednak tak to robiłem od początku i dlatego to wygląda jak wygląda..

dla uaktualnienia

[code]
FILE * odczyt;
odczyt = fopen ("znajomi.txt", "r");
int licznik_zap = 0;
pomoc_2 = glowny;
do{
pomoc_2 = (struct znajomi *) malloc(sizeof(struct znajomi));
if(glowny == NULL)

        glowny = pomoc_2;
    else

        poprz -> nast = pomoc_2;
        pomoc_2 -> nast = NULL;
        pomoc_2 -> numer = licznik_zap + 1;
        fscanf(odczyt, "%s", pomoc_2 -> imie);
        fscanf(odczyt, "%s", pomoc_2 -> nazwisko);
        fscanf(odczyt, "%s", pomoc_2 -> telefon);
        fscanf(odczyt, "%s", pomoc_2 -> mail);
        fscanf(odczyt, "%s", pomoc_2 -> pesel);
        fscanf(odczyt, "%s", pomoc_2 -> data);
        //fscanf(odczyt, "%d", pomoc_2 -> plec);
        licznik_zap++;
        poprz = pomoc_2;
    }while(fscanf(odczyt, "%c") != EOF);

    fclose(odczyt);

[/code]

tak wyglada teraz wczytanie z pliku

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