Struktura postac rpg

0

Witam mam taki oto program

#include <stdio.h>
#include<stdlib.h>
struct struktura {char name[20]; int hp,exp,strenght;}zmienna;

int main(void)
{
FILE *rpg = fopen("rpg.txt", "w+");
int a,i,rozmiar,licznik;
licznik = 0;
rozmiar = sizeof(char) + 3*(sizeof(int));
char tab[200];
do
{
printf("1) Stworz postac\n");
printf("2) Wyswietl postacie\n");
printf("3) EXIT\n");
scanf("%d", &a);
switch(a)
{
case 1:
printf("Podaj imie\n");
scanf("%s", &zmienna.name);
printf("Podaj HP\n");
scanf("%d", &zmienna.hp);
printf("Podaj EXP\n");
scanf("%d", &zmienna.exp);
printf("Podaj SILE\n");
scanf("%d", &zmienna.strenght);
fprintf(rpg, "%s %d %d %d\n", zmienna.name, zmienna.hp, zmienna.exp, zmienna.strenght);
licznik++;
}
}while(a!=2);
do
{
fgets(tab,40,rpg);
printf("%s\n" ,tab);

}while(!feof);
}


 

Nie dziala mi odczytywanie i wypisywanie stworzonych postaci, nie wiem rowniez jak zdefiniowac rozmiar tablicy (tab[200]) bo przeciez moge stworzyc dowolna ilosc postaci, prosze o wskazowki :) Zastanawiam sie rowniez czy nie lepiej by bylo uzyc fwrite i fread ?

0

Zrób sprawdzenie czy ci go w ogóle znajduje

0

Zapisalem struktur do pliku, prosze mi powiedziec czy to jest dobrze oraz prosze o jakas konkretna wskazowke jak ten plik teraz odczytac i wyswietlic

#include <stdio.h>
#include<stdlib.h>
struct struktura {char name[20]; int hp,exp,strenght;}zmienna;

int main(void)
{
struct struktura *all = &zmienna;
FILE *rpg = fopen("rpg.bin", "w+");
char tab[200];
int a,i,rozmiar,licznik;
do
{
printf("1) Stworz postac\n");
printf("2) EXIT\n");
scanf("%d", &a);
switch(a)
{
case 1:
printf("Podaj imie\n");
scanf("%s", &zmienna.name);
printf("Podaj HP\n");
scanf("%d", &zmienna.hp);
printf("Podaj EXP\n");
scanf("%d", &zmienna.exp);
printf("Podaj SILE\n");
scanf("%d", &zmienna.strenght);
fwrite(zmienna.name, strlen(zmienna.name),1,rpg);
fwrite(&zmienna.hp,sizeof(int),1,rpg);
fwrite(&zmienna.exp,sizeof(int),1,rpg);
fwrite(&zmienna.strenght,sizeof(int),1,rpg);
licznik++;
}
}while(a!=2);
}

 
1

Jeżeli zapisujesz binarnie, to zapisuj tak aby każda postać miała taki sam rozmiar.
W Twoim przypadku rozmiar zależy od długości nazwy, czyli brakuje informacji gdzie zaczyna się następna postać i ile zajmuje, a więc trudno to odczytać.
Lepiej zapisuj zawsze 20 bajtów nazwy, wtedy wiesz, łatwo policzyć gdzie jest konkretna postać i konkretne pole struktury.
Możesz też zapisać całą strukturę do pliku: fwrite(&zmienna, sizeof(zmienna), 1, rpg), gdby będziesz odczytywał plik wiesz, że postać pierwsza jest na pozycji 0,
postać druga na pozycji 0+sizeof(zmienna), trzecia 0+sizeof(zmienna)+sizeof(zmienna) .. n-ta (n-1)*sizeof(zmienna).

ps. jeśli chcesz aby kod był przenośny, to dodaj "packed" do struktury

0

Dzieki za podpowiedz, w meidzy czasie 'wykombinowalem' cos takiego

fwrite(zmienna.name, sizeof(zmienna.name),1,rpg);
fwrite(&zmienna.hp,sizeof(zmienna.hp),1,rpg);
fwrite(&zmienna.exp,sizeof(zmienna.exp),1,rpg);
fwrite(&zmienna.strenght,sizeof(zmienna.strenght),1,rpg);
}
}while(a!=2);	
fread(zmienna.name, sizeof(zmienna.name), 1, rpg);
fread(&zmienna.hp, sizeof(zmienna.hp), 1, rpg);
fread(&zmienna.exp, sizeof(zmienna.exp), 1, rpg);
fread(&zmienna.strenght, sizeof(zmienna.strenght), 1, rpg);
printf("%s %d %d %d",zmienna.name, zmienna.hp , zmienna.exp , zmienna.strenght); 

Problem jest taki ze jezeli przykladowo zapisze do pliku takie cos "maciek,1,1,1", a nastepnie go wczytam i wyswiele to dostaje (maciek 0.0000000d 1 4201264, Co jest nie tak ?
@Edit : Znalazlem blad, juz dziala :)

0

Prosze o pomoc : Jeżeli zapisze dane do pliku w ten sposob i je potem odczytam to jest wporzadku

FILE *rpg = fopen("rpg.bin", "wb");
struct struktura {char name[20]; int hp,exp,strenght;}zmienna;
fwrite(zmienna.name, sizeof(zmienna.name),1,rpg);
fwrite(&zmienna.hp,sizeof(zmienna.hp),1,rpg);
fwrite(&zmienna.exp,sizeof(zmienna.exp),1,rpg);
fwrite(&zmienna.strenght,sizeof(zmienna.strenght),1,rpg);
  FILE *rpg = fopen("rpg.bin", "rb");
fread(zmienna.name, sizeof(zmienna.name), 1, rpg);
fread(&zmienna.hp, sizeof(zmienna.hp), 1, rpg);
fread(&zmienna.exp, sizeof(zmienna.exp), 1, rpg);
fread(&zmienna.strenght, sizeof(zmienna.strenght), 1, rpg);
printf("%s %d %d %d",zmienna.name, zmienna.hp , zmienna.exp , zmienna.strenght); 

ale chcialem zapisac i wczytac wszystko naraz czyli

fwrite(&zmienna,sizeof(zmienna),1,rpg);
fread(&zmienna, sizeof(zmienna), 1, rpg);
printf("%s\n", zmienna); 

Zalozmy ze wprowadze nastepujace dane (maciek 1 2 3) w pierwszym przypadku jak uzyje printf to dostaje "maciek 1 2 3" natomiast w drugim przypadku dostaje tylko "maciek". Co jest zle ?
@Edit : problem rozwiazany

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