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