Komputer Świat Ekspert - Forum: [C] Funkcja nie działa poprawnie po dodaniu menu (problem z 1 posta rozwiązany) - Komputer Świat Ekspert - Forum

Skocz do zawartości

Strona 1 z 1

[C] Funkcja nie działa poprawnie po dodaniu menu (problem z 1 posta rozwiązany) W tej chwili zadaję pytania dotyczące programu. Będzie ich więcej.

#1 Użytkownik nie jest zalogowany   Kasztan 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 72
  • Rejestracja: 16-marzec 06

Napisano 07 styczeń 2012, 14:34

Proszę o pomoc w naprawieniu błędu. Visual Studio wyświetla błąd przy linii: int main(int argc, char *argv[]){ i twierdzi że brakuje średnika po znaku {
Wrzucam cały kod, bo może to mieć coś do rzeczy. Tak nawiasem jak ktoś zobaczy jakieś błędy programistyczne, nieprawidłowe nawyki, proszę o zwrócenie uwagi. Dzięki
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h> //potrzebna do polskich czcionek

#define MAX_NICK 81

struct zawodnik{
	int id;
	char nick[MAX_NICK];
	int elo;
	int liczbaWygranych;
	int liczbaPrzegranych;
	struct zawodnik *pNext;
};

int czyWolny(char nick){
	return 0;
};

int wolnyId(void){
	return 0;
};


void dodajGracza(){
	struct zawodnik *glowny=NULL;
	struct zawodnik *poprzedni, *biezacy;
	char wejscie[MAX_NICK];

	printf("Podaj pożądany nick: ");
	while(gets(wejscie) !=NULL && wejscie[0] !='\0'){
		biezacy=(struct zawodnik *)malloc(sizeof(struct zawodnik));
		if(glowny==NULL)
			glowny=biezacy;
		else
			poprzedni->pNext = biezacy;
		biezacy->pNext = NULL;
		strcpy(biezacy->nick, wejscie);
	printf("Konto gracza %s zostało pomyślnie utworzone.",biezacy->nick);
};


int main(int argc, char *argv[]){
	setlocale(LC_ALL,"polish");
	dodajGracza();
}

Użytkownik Kasztan edytował ten post 08 styczeń 2012, 15:36

0

#2 Użytkownik nie jest zalogowany   Poszukiwacz 

  • Sniper at work
  • Pip
  • Grupa: Czytelnicy
  • Postów 347
  • Rejestracja: 31-marzec 05

Napisano 07 styczeń 2012, 14:52

Witam.
W c++ nie pisałem od wieków, ale kompilator pokazuje ci ładnie wszystkie błędy.

1. Funkcja main powinno zwracać wartość
2. Funkcja dodajGracza jest otwarta "{" ale nie została zamknięta - brak "}")


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h> //potrzebna do polskich czcionek

#define MAX_NICK 81

struct zawodnik{
        int id;
        char nick[MAX_NICK];
        int elo;
        int liczbaWygranych;
        int liczbaPrzegranych;
        struct zawodnik *pNext;
};

int czyWolny(char nick){
        return 0;
}

int wolnyId(void){
        return 0;
}


void dodajGracza(){
        struct zawodnik *glowny=NULL;
        struct zawodnik *poprzedni, *biezacy;
        char wejscie[MAX_NICK];

        printf("Podaj pożądany nick: ");
        while(gets(wejscie) !=NULL && wejscie[0] !='\0'){
                biezacy=(struct zawodnik *)malloc(sizeof(struct zawodnik));
                if(glowny==NULL)
                        glowny=biezacy;
                else
                        poprzedni->pNext = biezacy;
                biezacy->pNext = NULL;
                strcpy(biezacy->nick, wejscie);
        printf("Konto gracza %s zostało pomyślnie utworzone.",biezacy->nick);
}
}


int main(int argc, char *argv[]){
        setlocale(LC_ALL,"polish");
        dodajGracza();

		return 0;
}


We're warriors, warriors of the world
Like thunder from the sky - sworn to fight and die
We're warriors, warriors of the world
© Manowar
0

#3 Użytkownik nie jest zalogowany   Kasztan 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 72
  • Rejestracja: 16-marzec 06

Napisano 07 styczeń 2012, 15:27

Dzięki. Masz rację. Nieco zmodyfikowałem program - tzn dodałem menu i nie wiem czemu dzieje się w ten sposób. Po wybraniu 1 (switch) uruchamia się funkcja dodajGracza() ale poprawnie działa tylko pierwsza linijka printf(). Oto aktualny kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h> //potrzebna do polskich czcionek

#define MAX_NICK 81

struct zawodnik{
	int id;
	char nick[MAX_NICK];
	int elo;
	int liczbaWygranych;
	int liczbaPrzegranych;
	struct zawodnik *pNext;
};

void dodajGracza(void){
	struct zawodnik *glowny=NULL;
	struct zawodnik *poprzedni, *biezacy;
	char wejscie[MAX_NICK];

	printf("Podaj pożądany nick: ");
	while(gets(wejscie) !=NULL && wejscie[0] !='\0'){
		biezacy=(struct zawodnik *)malloc(sizeof(struct zawodnik));
		if(glowny==NULL)
			glowny=biezacy;
		else
			poprzedni->pNext = biezacy;
		biezacy->pNext = NULL;
		strcpy(biezacy->nick, wejscie);
		printf("Konto gracza %s zostało pomyślnie utworzone.",biezacy->nick);
	};
};

int czyWolny(char nick){
	return 0;
};

int wolnyId(void){
	return 0;
};

int wyswietlMenu(void){
	char z;
	while (1)
	{
		printf("Menu:\n1. Dodaj gracza\n0. Wyjście z programu\n\n");
		while ((z = getchar())<' ');
		switch (z)
		{
		case '1':
			dodajGracza();
			break;
		case '0':
			return 0;
		};
	};
}

int main(int argc, char *argv[]){
	setlocale(LC_ALL,"polish");
	wyswietlMenu();
	return 0;
}

0

#4 Użytkownik nie jest zalogowany   Rekman 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 26
  • Rejestracja: 25-czerwiec 09

Napisano 08 styczeń 2012, 11:19

Twój problem zaczyna się w funkcji wyswietlMenu(). Użyta tam funkcja getchar() zwraca następny znak do strumienia wejściowego (stdin) jest nim znak nowej linii ('\n'). Natępnie w funkcji dodajGracza() próbujesz wczytać dane ze strumienia wejściowego funkcją gets(), ale on nie jest pusty (jest w nim '\n'). Jego zawartość zostaje przepisana do tablicy wejscie. Ponieważ strumień wejściowy zawierał znak nowej linii to w tablicy zostanie umieszczony znak końca łańcucha ('\0').
Można to ominąć np. używając funkcji getche() zamiast getchar().

Niestety funkcja dodajGracza() zawiera także inne błędy. Wskaźnik poprzedni do struktury zawodnik nie został zainicjalizowany. Zatem próba jego użycia skończy się błędem dostępu do pamięci. Wskaźnik glowny wskazuje na pierwszy zaalokowany obiekt (głowę) i nic poza tym.
Zmień:
if(glowny==NULL)
    glowny=biezacy;
else      
    poprzedni->pNext = biezacy;

na:
if(glowny==NULL)
{
    glowny=biezacy;
    poprzedni = glowny;
}
else
{
    poprzedni->pNext = biezacy;
    poprzedni = biezacy;
}


Nie jest zwalniana pamięć zarezerwowana funkcją malloc().

Pozostał jeszcze problem wyświetlania informacji i pobierania danych w osobnych liniach, ale z tym powinieneś sam poradzić.
0

#5 Użytkownik nie jest zalogowany   Kasztan 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 72
  • Rejestracja: 16-marzec 06

Napisano 08 styczeń 2012, 15:28

Dzięki za wyczerpującą odpowiedź. Jeśli chodzi o zwolnienie pamięci, czy dodanie linii
free(biezacy);
załatwi sprawę? Przyznam się, że nie do końca rozumiem kodowanie stosu, dlatego mam pytanie: czy po zwolnieniu pamięci zarezerwowanej na strukturę dane takie jak wpisany nick pozostaną w pamięci? Mam zamiar dodać funkcję zapisującą dane zawodników do pliku i jeszcze parę innych wykonujących określone operacje. Cały program zajmuje się rankingiem w systemie ELO. Czy taki stos, jaki piszę będzie odpowiedni aby zrealizować program z mini-bazą danych, wyszukiwaniem np. ilości wygranych danego gracza czy wyświetlaniem aktualnego rankingu/miejsca?

Aktualny kod programu:
//System ELO
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h> //getche()
#include <locale.h> //potrzebna do polskich czcionek

#define MAX_NICK 81

struct zawodnik{
	int id;
	char nick[MAX_NICK];
	int elo;
	int liczbaWygranych;
	int liczbaPrzegranych;
	struct zawodnik *pNext;
};

void dodajGracza(void){
	struct zawodnik *glowny=NULL;
	struct zawodnik *poprzedni, *biezacy;
	char wejscie[MAX_NICK];

	printf("Podaj pożądany nick: ");
	while(gets(wejscie) !=NULL && wejscie[0] !='\0'){
		biezacy=(struct zawodnik *)malloc(sizeof(struct zawodnik));

		if(glowny==NULL){
			glowny=biezacy;
			poprzedni = glowny;
		}
		else{
			poprzedni->pNext = biezacy;
			poprzedni = biezacy;
		}

		strcpy(biezacy->nick, wejscie);
		printf("Konto gracza %s zostało pomyślnie utworzone.\n",biezacy->nick);
		free(biezacy);
	};
};

int czyWolny(char nick){
	return 0;
};

int wolnyId(void){
	return 0;
};

int wyswietlMenu(void){
	char z;
	while (1)
	{
		printf("Menu:\n1. Dodaj gracza\n0. Wyjście z programu\n\n");
		while ((z = getche())<' ');
		switch (z)
		{
		case '1':
			printf("\n");
			dodajGracza();
			break;
		case '0':
			return 0;
		};
	};
}

int main(int argc, char *argv[]){
	setlocale(LC_ALL,"polish");
	wyswietlMenu();
	return 0;
}

Użytkownik Kasztan edytował ten post 08 styczeń 2012, 15:29

0

#6 Użytkownik nie jest zalogowany   Rekman 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 26
  • Rejestracja: 25-czerwiec 09

Napisano 08 styczeń 2012, 16:35

Cytat

czy po zwolnieniu pamięci zarezerwowanej na strukturę dane takie jak wpisany nick pozostaną w pamięci?

Wywołanie funkcji free() jest równoznaczne z utratą dostępu do danych wskazywanych przez przekazany wskaźnik. Jednak przy takiej implementacji funkcji dodajGracza(), zarezerwowaną pamięć można zwolnić tylko wewnątrz funkcji. Lepiej by było wskażnik główny przekazać jako argument i zwolić pamięć inną funkcją lub w pętli przed wyjściem z maina.

Cytat

Czy taki stos, jaki piszę będzie odpowiedni aby zrealizować program z mini-bazą danych, wyszukiwaniem np. ilości wygranych danego gracza czy wyświetlaniem aktualnego rankingu/miejsca?

Pisząc w C nie masz wielkiego wyboru. Dużo łatwiej byłoby zrealizować to zadanie w C++ bazując na bibliotece standardowej z jej algorytmami i kontenerami.
0

#7 Użytkownik nie jest zalogowany   Kasztan 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 72
  • Rejestracja: 16-marzec 06

Napisano 08 styczeń 2012, 18:38

Czy funkcja powinna być zadeklarowana w ten sposób:
void dodajGracza(struct zawodnik *glowny){
?
Próbowałem w funkcji wyswietlMenu() wypisać na ekran nick poprzez
printf("%c", glowny->nick);
i różne inne, dziwne kombinacje (dodawanie gwiazdki w przeróżnych miejscach itd ale visual studio podawał błędy: glowny używany bez wcześniejszej inicjalizacji, a po moich zmianach błąd access violation - wartości struktury miały różne losowe wartości, albo nie mogły zostać obliczone.
0

#8 Użytkownik nie jest zalogowany   Rekman 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 26
  • Rejestracja: 25-czerwiec 09

Napisano 08 styczeń 2012, 20:55

Funkcję deklarujesz dobrze. Jednak musisz usunąć z jej definicji (ciała) lokalny wskaźnik o nazwie glowny.
Sam wskaźnik należy zadeklarować globalnie lub lokalnie na początku maina. Ze wskaźnika globalnego będą mogły korzystać wszystkie funkcje, w których zasięgu widzialności jest, ale to gorsze rozwiązanie.
Lokalny wskażnik należy przekazać do każdej funkcji, która będzie go używać. Dlatego kompilator zgłaszana błędy, gdy prbujesz użyć go wewnątrz funkcji wyswietlMenu().
0

#9 Użytkownik nie jest zalogowany   Kasztan 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 72
  • Rejestracja: 16-marzec 06

Napisano 08 styczeń 2012, 21:57

Udało mi się rozwiązać problem jaki napotkałem po drodze i zamieściłem go w tym poście, dlatego go nadpisuję. Teraz chciałbym zająć się funkcją czyWolny() i dalej dodajGracza(). Chcę aby dodajGracza() zapisywał w pamięci (lub w zewnętrznym pliku - taką funkcjonalność muszę dodać ale nie wiem czy teraz, czy później) strukturę wypełnioną danymi. czyWolny() ma przeglądać te struktury i sprawdzać czy wprowadzony łańcuch wejsciowy nie jest taki sam jak nick w którejkolwiej z istniejących struktur. Proszę o wskazówki.
//System ELO
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h> //getche()
#include <locale.h> //potrzebna do polskich czcionek

#define MAX_NICK 81
#define DOMYSLNE_ELO 1000

struct zawodnik{
	int ID;
	char nick[MAX_NICK];
	int ELO;
	int liczbaWygranych;
	int liczbaPrzegranych;
	struct zawodnik *pNext;
};

struct zawodnik * dodajGracza(){
	struct zawodnik *poprzedni, *biezacy;
	char wejscie[MAX_NICK];
	struct zawodnik *glowny=NULL;

	printf("Podaj pożądany nick: ");
	if (gets(wejscie) !=NULL && wejscie[0] !='\0' && czyWolny(wejscie)){
		biezacy=(struct zawodnik *)malloc(sizeof(struct zawodnik));

		if(glowny==NULL){
			glowny=biezacy;
			poprzedni = glowny;
		}
		else{
			poprzedni->pNext = biezacy;
			poprzedni = biezacy;
		};

		strcpy(biezacy->nick, wejscie);
		biezacy->ELO=DOMYSLNE_ELO;
		biezacy->ID=czyWolny(wejscie);
		printf("Konto gracza %s zostało pomyślnie utworzone. Graczowi przydzielono domyślną wartość %d ELO. ID gracza to %d.\n\n",biezacy->nick, biezacy->ELO, biezacy->ID);
	}
	else printf("Nie udało się utworzyć konta %s. Prawdopodobnie nick jest zajęty.\n\n",wejscie);
	return glowny;
};

//funkcja ma sprawdzać czy nick podany w łańcuchu wejscie jest wolny
int czyWolny(char *nick){
	int wolnyID=4;
	int iloscGraczy=3;
	int i=0;
	for(i;i<iloscGraczy;i++){
	if(strcmp(nick,"testowylancuch")==0){
	return 0;
	};
	return wolnyID;
};
}

int wyswietlMenu(){
	struct zawodnik *glowny;
	char z;
	
	while (1)
	{
		printf("Menu:\n1. Dodaj gracza\n0. Wyjście z programu\n\n");
		z = getche(); //getche() nie zapisuje znaku \n do stdin
		switch (z){
		case '1':
			printf("\n");
			glowny=dodajGracza();
			break;
		case '2':
			
			break;
		case '0':
			return 0;
		};
	};
};


int main(int argc, char *argv[]){
	struct zawodnik *glowny=NULL;
	setlocale(LC_ALL,"polish");
	wyswietlMenu();
	free(glowny);
	return 0;
}

Użytkownik Kasztan edytował ten post 09 styczeń 2012, 15:42

0

#10 Użytkownik nie jest zalogowany   Rekman 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 26
  • Rejestracja: 25-czerwiec 09

Napisano 09 styczeń 2012, 19:51

Poszę bardzo. Zrób to. Może wówczas coś podpowiem>
Natępne pytanie. To Twój wbór.
Wskazówki...hmm
Każdy robi po swojemu. C do tego się nie nadaje, ale... starama się pomóc.
0

#11 Użytkownik nie jest zalogowany   Kasztan 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 72
  • Rejestracja: 16-marzec 06

Napisano 07 luty 2012, 14:37

Po napisaniu programu od nowa nie działa mi poprawnie funkcja wczytajStos(). Proszę o pomoc w naprawieniu jej. Ma ona wczytywać stos z pliku baza.csv utworzonego przez zapiszStos()

#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);
	}
}
/*
int wczytajStos(struct stos **pGlowa)
{
FILE *plik;
struct stos *tmp;
(tmp=*pGlowa);
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{
for(tmp;tmp!=NULL;tmp=tmp->pNext)
{
fscanf(plik, "%d;%d;%s",tmp->wartosc.ID, tmp->wartosc.ELO, tmp->wartosc.nick);
}
fclose(plik);
printf("\nDane zostaly pomyslnie wczytane z pliku baza.csv\n");
}
}
*/

void wczytajStos(struct stos **pGlowa, struct zawodnik gracz)
{
	struct stos *kontener;
	FILE *plik;
	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(tmp;tmp!=NULL;tmp=tmp->pNext)
		{
			fscanf(plik, "%d;%d;%s",tmp->wartosc.ID, tmp->wartosc.ELO, tmp->wartosc.nick);
			kontener->wartosc=gracz;
			kontener->pNext=*pGlowa;
			*pGlowa=kontener;
			printf("Udalo sie wczytac");
		}
	}
}

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

#12 Użytkownik nie jest zalogowany   Rekman 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 26
  • Rejestracja: 25-czerwiec 09

Napisano 12 luty 2012, 15:40

void wczytajStos(struct stos **pGlowa)
{
    FILE *plik;
    struct stos *tmp, *prev;
    int stan_odczytu;
    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
    {
        oczyscStos(pGlowa);
        tmp = (struct stos*)malloc(sizeof(struct stos));//bez sprawdzania czy się powiodła
        *pGlowa = prev = tmp;
        do
        {
            stan_odczytu = fscanf(plik, "%d;%d;%s\n",&tmp->wartosc.ID, &tmp->wartosc.ELO, &tmp->wartosc.nick);
            if(stan_odczytu == 3)//odczytano wszystkie potrzebne dane
            {
                //rezerwacja pamięci pod następny rekord (bez sprawdzania czy się powiodła)
                tmp->pNext = (struct stos*)malloc(sizeof(struct stos));
                prev = tmp;//wskaźnik do rekordu poprzedniego
                tmp = tmp->pNext;//ustawienie wskaźnika na kolejny rekord
            }
        } while(stan_odczytu == 3);
        if(tmp == *pGlowa)
        {
            *pGlowa = NULL;
            printf("Plik jest pusty.\n");
        }
        else
        {
            printf("Wczytano dane z pliku.\n");
        }
        //koniec stosu (stos ma jeden rekord więcej niż zawiera ich plik z danymi)
        prev->pNext = NULL;
        //zwolnienie pamięci dla nieodczytanego (nadmiarowego) rekordu
        free(tmp);
    }
    fclose(plik);
}

Korekty wymaga funkcja wyswietlMenu():
case '5':
              wczytajStos(&pGlowa); break;

i instrukcja w funkcji zapiszStos():
fprintf(plik,"%d;%d;%s\n",tmp->wartosc.ID,tmp->wartosc.ELO,tmp->wartosc.nick);


- '\n' na końcu łańcycha formatujacego. Teraz każdy rekord będzie zapisywany i odczytuwany z osobnej linii.

Parę innych błędów (wad) pozostawiam do samodzielnego usunięcia.



EDIT:
if(prev == *pGlowa)
Taki warunek uniemożliwia wczytanie pliku z 1 rekordem. Dlatego zmieniłem na:
if(tmp == *pGlowa)

Użytkownik Rekman edytował ten post 13 luty 2012, 19:15

0

Strona 1 z 1


Szybka odpowiedź

  

Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych


Zmień widoczność shoutboxa Shoutbox

emikyou  : (16 kwiecień 2012 - 13:26) @Ferrari: Na PŁ korzystają z "OpenGL SuperBible: Comprehensive Tutorial and Reference" i "OpenGL Programming Guide: The Official Guide to Learning OpenGL, Versions 3.0 and 3.1"
wtomczak  : (10 kwiecień 2012 - 09:27) masz problem z komputerem napisz na facebooku na stronie WT654, na pewno pomoże
Maciej :)  : (08 kwiecień 2012 - 09:36) A co do reklam, to mi na operze adBlock coś nie służy, szczególnie z postami bota redakcji :( od kiedy go dali, to zaczęło się walić..
Maciej :)  : (08 kwiecień 2012 - 09:35) Hej witam :) no, jak przestałem kupować Eksperta to wzięli i wstrzymali ;| także nie mam tylko numeru pierwszego i ostatniego :p trochę szkoda, parę lat się było...
neo5628  : (05 kwiecień 2012 - 21:57) Help http://forum.ks-ekspert.pl/topic/140746-problem-z-dzwiekiem/ Proszę
PiKey  : (21 marzec 2012 - 18:24) ludzie, pomóżcie :) http://forum.ks-ekspert.pl/topic/140418-jak-dziala-sprawdzanie-wykonania-zadania-na-stronach-typu-doladujse/
PiKey  : (21 marzec 2012 - 18:24) ds
A:-)Brunuś  : (17 marzec 2012 - 19:17) jest tu ktoś? http://forum.ks-ekspert.pl/topic/140400-firewire-obudowa-do-dysku-25-—-200-zlo/
Ferrari  : (16 marzec 2012 - 11:12) Polećcie dobrą książkę do OpenGL albo kurs w sieci :)
lisz55  : (15 marzec 2012 - 21:44) przez ktore reklamy? nie widze zeby jakies nowe byly
Pretender  : (15 marzec 2012 - 18:22) :/
Pretender  : (15 marzec 2012 - 18:22) az sie nie chce czytac tego forum przez te parszywe reklamy...ale dzidostwo zrobili...
yojo2  : (12 marzec 2012 - 13:26) wchodz na forum przez lynxa :P
Ferrari  : (10 marzec 2012 - 21:21) Jak tu nie korzystać z AdBlocka, kiedy Forum Eksperta wywala reklamę na całą stronę?
lisz55  : (09 marzec 2012 - 21:41) siedze i czytam calkiem niezle ale mogl by ktos wytlumaczyc o co chodzi z dark knightem nie widzialem tego filmu
lisz55  : (09 marzec 2012 - 21:40) to moze rozruszam troche czat http://moviesascode.net/
Pretender  : (06 marzec 2012 - 16:43) rozmowy tak jak Enty prowadziły w powieści Tolkiena :P
dawido90  : (05 marzec 2012 - 15:03) to już poprostu przyzwyczajenie
yojo2  : (04 marzec 2012 - 22:25) mailem przestac tu wchodzic, ale stwierdzilem ze skoro i tak zwykle tu tylko wchodze i wychodze, to wszystko jedno :P
Ferrari  : (04 marzec 2012 - 21:16) Już myślałem, że ruch na forum spada zera, a jednak pochodna zmieniła znak :)
Rozszerz pole shoutboxa