Problem z wczytywaniem z pliku. fscanf() źle użyte?

0

Proszę rzucić okiem na funkcję wczytajStos(). Pozostałe funkcje działają tak, jak powinny. Ta funkcja ma wczytywać z pliku dane struktur i wrzucać je na stos.

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#include<math.h>
#include<conio.h>

#define MAX_NICK 81

struct zawodnik
{
    int ID,ELO;
    char nick[MAX_NICK];
};
struct stos
{
    struct zawodnik wartosc;
    struct stos *pNext;
};
void naStos(struct stos **pGlowa, struct zawodnik gracz, int *wolnyID)
{
    struct stos *kontener;
    kontener=(struct stos*)malloc(sizeof(struct stos));
    if(kontener==NULL)
    {
        printf("blad pamieci");
        *pGlowa=NULL;
    }
    else
    {
        kontener->wartosc=gracz;
        kontener->pNext=*pGlowa;
        *pGlowa=kontener;
        *wolnyID=*wolnyID+1;
        kontener->wartosc.ID=*wolnyID;
    }
}
int zeStosu(struct stos **pGlowa, struct zawodnik *pWartosc)
{
    struct stos *tmp;
    if (*pGlowa==NULL)
    {
        printf("Blad. Stos jest pusty.\n");
        return 0;
    }
    else
    {
        pWartosc->ELO=(*pGlowa)->wartosc.ELO;
        pWartosc->ID=(*pGlowa)->wartosc.ID;
        tmp=*pGlowa;
        *pGlowa=(*pGlowa)->pNext;
        free(tmp);
        return 1;
    }
}
void oczyscStos(struct stos **pGlowa)
{
    struct stos *tmp;
    if (*pGlowa==NULL)
    {
        printf("\nStos zostal oczyszczony\n");
        return;
    }
    else
        do
        {
            tmp=*pGlowa;
            (*pGlowa)=(*pGlowa)->pNext;
            free(tmp);
        }
        while(*pGlowa!=NULL);
        printf("\nStos zostal oczyszczony\n");
        return;
}
void drukujStos(struct stos **pGlowa)
{
    struct stos *tmp;
    (tmp=*pGlowa);
    if(tmp==NULL)
    {
        printf("\nStos jest pusty.\n");
        return;
    }
    else
    {
        printf("\nZawartosc stosu:\n");
        for(tmp;tmp!=NULL;tmp=tmp->pNext)
        {
            printf("Nick:%sID:%d ELO:%d\n\n",tmp->wartosc.nick,tmp->wartosc.ID,tmp->wartosc.ELO);
        }
    }
}
void zapiszStos(struct stos **pGlowa)
{
    FILE *plik;
    struct stos *tmp;
    plik = fopen("baza.csv", "w");
    (tmp=*pGlowa);
    if(tmp==NULL)
    {
        printf("\nStos jest pusty.\n");
        return;
    }
    else if(plik==NULL)
    {
        printf("\nWystapil blad zapisu do pliku.\n");
        return;
    }
    else
    {
        for(tmp;tmp!=NULL;tmp=tmp->pNext)
        {
            fprintf(plik,"%d;%d;%s",tmp->wartosc.ID,tmp->wartosc.ELO,tmp->wartosc.nick);
        }
        printf("\nDane zostaly pomyslnie zapisane do pliku baza.csv\n");
        fclose(plik);
    }
}

void wczytajStos(struct stos **pGlowa, struct zawodnik gracz)
{
    struct stos *kontener;
    FILE *plik;
    int i;
    struct stos *tmp;
    (tmp=*pGlowa);
    kontener=(struct stos*)malloc(sizeof(struct stos));
    plik=fopen("baza.csv","r");
    if(plik==NULL)
    {
        printf("Błąd otwarcia pliku baza.csv\nPrawdopodobnie plik nie istnieje lub zostal zapisany pod inna nazwa.");
        return;
    }
    else if(kontener==NULL)
    {
        printf("blad pamieci");
        *pGlowa=NULL;
    }
    else
    {
        for(i=1;i<10;i++)
        {
            fscanf(plik,"%d;%d;%s",&tmp->wartosc.ID,&tmp->wartosc.ELO,&tmp->wartosc.nick);
            printf("\n%d %d %s\n",tmp->wartosc.ID,tmp->wartosc.ELO,tmp->wartosc.nick);
            kontener->wartosc=gracz;
            kontener->pNext=*pGlowa;
            *pGlowa=kontener;
            printf("\nUdalo sie wczytac\n");
            fclose(plik);
        }
    }
}
int wyswietlMenu()
{
    char z, bufor[MAX_NICK], *wynik;
    int *wolnyID=0;
    struct stos *pGlowa=NULL;
    struct zawodnik gracz;

    while(1){
        printf("1. Dodaj gracza na stos\n2. Oczysc stos\n3. Drukuj stos\n4. Zapisz stos do pliku\n0. Koniec\n");
        while ((z = getche())<' ');
        switch(z){
        case '3': 
            drukujStos(&pGlowa); break;
        case '4':
            zapiszStos(&pGlowa); break;
        case '2': 
            oczyscStos(&pGlowa); break;
        case '1':
            printf("\nPodaj nick: ");
            wynik = fgets (bufor, MAX_NICK, stdin);
            if(wynik!=0){
                strcpy(gracz.nick, bufor);
                gracz.ELO=1000;
                naStos(&pGlowa,gracz, &wolnyID);
                printf("Konto gracza zostalo pomyslnie utworzone. ID:%d, ELO:%d\n",wolnyID,gracz.ELO);
            }
            else printf("Blad odczytu\n");
            break;
        case '5':
            wczytajStos(&pGlowa,gracz); break;
        case '0': printf("\n"); return 0;
        };

    }
    //zeStosu(&pGlowa,&gracz);
}
int main()
{
    wyswietlMenu();
    system("PAUSE");
}
0

Masz problem przy zapisywaniu do pliku tekstowego. Nick bieżącego wpisu sklei ci się z ELO następnego wpisu. Najwyraźniej brakuje ci znaku końca linii.

0

Właśnie się nie sklei, bo znak końca linii jest uwzględniony w łańcuchu. Jak wcześniej nick był zapisywany we wcześniejszych komórkach, to wszystko, co po nicku było zapisywane w nowej linii. Dlatego przesunąłem nick na koniec i usunąłem \n

0

No to masz nieścisłość, bo scanf z %s czyta tylko do pierwszego białego znaku (spacja, tab, CR), bez tego znaku. Czyli po wczytaniu masz nick bez znaku konca linii i po następnym zapisie masz problem, ktory opisalem wcześniej.

0

To co powinienem zmienić, i jak?

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