Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » speichern von structs geht nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]
010
18.04.2004, 15:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich weiss auch spontan gar nicht ob immer garantiert ist ob die daten eines structes hintereinander im speicher abgelegt werden, mal davon abgesehen das ja das struct auch pointer auf speicherbereiche beinhalten könnte die deren inhalt dann so auch nicht gesichert werden würde...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
18.04.2004, 16:13 Uhr
Pablo
Supertux
(Operator)


Was ich in solchen Fällen mache ist folgendes: (ohne zu testen)

C++:
typedef struct {
  ...
} DATENTYP;
...
void save(const char* filename, DATENTYP* data)
{
    void* ptr;
    FILE* f=fopen(filename, "wb");
    ptr = malloc(sizeof(DATENTYP);
    ptr = memcpy(ptr, data, sizeof(DATENTYP));
    fwrite(ptr, sizeof(DATENTYP), 1, f);
    fclose(f);
}



Das solle genügen, meiner Meinung nach.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 18.04.2004 um 17:07 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
18.04.2004, 16:48 Uhr
mike
Pinguinhüpfer
(Operator)


@wissender: http://193.171.122.120/~mike/c/main.c
Irgendwo ist der Fehler - bitte nicht lachen - blutiger Anfänger

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
18.04.2004, 16:55 Uhr
Pablo
Supertux
(Operator)


Hast du den fehler beim Laden oder beim Speichern?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
18.04.2004, 17:09 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das Einfachste bei so einem Problem wäre doch die Elemente des Strukt selber zu speichern anstatt das ganze Strukt in einem.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
18.04.2004, 18:05 Uhr
(un)wissender
Niveauwart


@mike
Dein Problem ist, dass du nach wie vor Pointer speicherst.
Du kannst nicht einfach dein struct so in eine Datei kopieren, sondern musst den Namen Zeichen für Zeichen kopieren, ebenso so wie die Adresse.
Denn: Diese Speicherbereich ist nicht im Struct enthalten, sondern nur ein
Zeiger!
Den zu speichern ist völlig unsinnig.
Gleich kommt ein Beipsiel...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
18.04.2004, 18:16 Uhr
Pablo
Supertux
(Operator)


Ok, dann http://rex.supertux.homelinux.org/opensave.c
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
18.04.2004, 18:48 Uhr
(un)wissender
Niveauwart


Ein Beispiel, wie man ein einen Namen unbekannter Länge speichern kann.
Und ja, es sind gotos und die passen hier gut hin, c ist nun mal eine Krankheit.


C++:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct testStruct
{
    char *name;
} TEST;

int main(int argc, char * args[])
{
    char * filename, nameToSave;
    int length;
    FILE *myFile;
    
    if(argc < 3)
    {
        printf("Bitte Dateiname und Namen zum speichern angeben");
        return 0;
    }
      
    filename = args[1];  
    if((myFile = fopen(filename, "w+b")) == NULL)
    {
        printf("Error beim dateioeffnen: %s!", filename);
        return 0;
    }
      
    length = strlen(args[2]) + 1;
    TEST.name = (char *)malloc(length * sizeof(char));
    strcpy(TEST.name, args[2]);
    
    if(fwrite(&length, sizeof(int), 1, myFile) < 1)
    {
        printf("Error beim schreiben der Stringlaege: %d!", length);
        goto exit;
    }
    
    if(fputs(TEST.name, myFile) == EOF)
    {
        printf("Error beim schreiben des Strings: %s!", TEST.name);
        goto exit;
    }
    
    printf("Geschrieben wurde %s mit eine Laenge von %d.\n", TEST.name, length - 1);
    
    if(fseek(myFile, 0, SEEK_SET) != 0)
    {
        printf("Fehler beim zuruecksetzen des Dateizeigers!");
        goto exit;
    }
    
    if(fread(&length, sizeof(int), 1, myFile) < 1)
    {
        printf("Error beim lesen der Stringlaege: %d!", length);
        goto exit;
    }
    
    if(fgets(TEST.name, length, myFile) == NULL)    
    {
        printf("Error beim lesen des Strings!");
        goto exit;
    }
  
    printf("Aus der Datei %s gelesen: %s.\n", filename, TEST.name);
    
    exit:
    fclose(myFile);
    free(TEST.name);    
    return 0;
}


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 18.04.2004 um 18:49 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
18.04.2004, 18:51 Uhr
Pablo
Supertux
(Operator)



Zitat:
(un)wissender postete

Und ja, es sind gotos und die passen hier gut hin, c ist nun mal eine Krankheit.




hmmm.... aber eine schöne Krankheit

wir haben es schon hingekriegt
schau:
http://rex.supertux.homelinux.org/test4.c (zum Schreiben)
http://rex.supertux.homelinux.org/test5.c (zum Lesen)
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 18.04.2004 um 18:52 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
18.04.2004, 19:11 Uhr
(un)wissender
Niveauwart


Die beste Krankheit taugt nichts!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: