Jag har en struktur som ser ut så här
struct TSpar
{
char *Namn;
char *Info;
char *Ingred;
char *Fil;
};
Innehåller massa pekare
Hur sparar man dessa till en fil.
Har bara lyckats att spara adresserna och inte innehållet
5 svar · 341 visningar · startad av Niclas Ohlsson
Jag har en struktur som ser ut så här
struct TSpar
{
char *Namn;
char *Info;
char *Ingred;
char *Fil;
};
Innehåller massa pekare
Hur sparar man dessa till en fil.
Har bara lyckats att spara adresserna och inte innehållet
Ett bra sätt är ju att skapa en parameter som talar om längden på varje post i structen.
struct TSpar
{
char *Namn;
unsigned int NamnLen;
char *Info;
unsigned int InfoLen;
char *Ingred;
unsigned int IngredLen;
char *Fil;
unsigned int FilLen;
};
Ett enkelt sätt är att du bestämmer dig för hur stora textfält du vill ha i structen.
struct TSpar
{
char Namn[20];
char Info[20];
char Ingred[20];
char Fil[20];
}
Då är det bara att skriva ner structen till en fil (öppna för binär skrivning). Structens storlek är alltid konstant. Nackdelen är att du måste bestämma dig en gång för alla för hur stor structen ska vara.
Då skriver du ner structen genom
filpekare = fopen("filnamn", "wb");
fwrite(TSparVariabel, sizeof(TSpar), 1, filpekare);
Det finns flera sätt.
1. Spara strängens längd följt av strängens innehåll.
int len = strlen(sträng) + 1; // Längd inkl. 0-terminator
fwrite(&len, sizeof len, 1, fp);
fwrite(sträng, len, 1, fp);
fread(&len, sizeof len, 1, fp);
sträng = new char[len];
fread(sträng, len, 1, fp);
2. Spara strängen direkt följt av 0-terminator eller radbrytning. När du läser in så skapar du en buffert och söker efter 0-terminator eller radbrytning. Finns det ingen så ökar du bufferns storlek och fortsätter söka tills det är funnet.
3. Använd fast längd. Exempel i tidigare inlägg.
Jag har problem när jag ska spara min struktur, som ligger i en headerfilen cars.h:
struct Player
{
bool started;
bool owncar;
bool active;
int money;
int totmoney;
string pl_name;
int pl_caryrmodel;
int pl_carprice;
int pl_carhp;
int pl_cartopspeed;
};
Sedan kör jag funktionerna savegame() och loadgame()
int main()
{
// Här anropas funktionerna savegame() och loadgame()
{
void loadgame()
{
FILE* file;
file = fopen("test", "wb");
fread(player_1, sizeof(Player), 1, file);
fclose(file);
huvudmeny();
}
void savegame()
{
FILE* file;
file = fopen("test", "wb");
fwrite(player_1, sizeof(Player),1, file);
fclose(file);
huvudmeny();
}
Vad gör jag för fel, vill gärna få det att funka...
Felmedelandet blir:
C2664: 'fread' : cannot convert parameter 1 from 'struct Player' to 'void *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Tackar för all hjälp jag kan få .........