wie speichere ich ein struct array und lese dies dann wieder ein?



  • Du hast die Bedingungen geändert: Nu hast du kein Array mehr, sondern einen Zeiger. In dem Fall musst du die Anzahl der Elemente übergeben:

    void speichern(struct datum* sicher, int n)
    


  • ja den zeiger hab ich nur gemacht damit der compiler nicht mehr meckert....
    Jetzt hab ich sowas hier, immer noch der selbe Fehler:

    void speichern(datum,int);//Protoype der Funktion
    
    speichern(*neu,x);//Aufruf der Funktion
    
    void speichern(struct datum* sicher, int n){
    FILE *f;  // Zeiger auf die Struktur zur Dateibearbeitung
     f = fopen("myfile.txt", "wb"); // Datei für Schreiben öffnen
     if(f == NULL)
        {
        printf("Datei %s kann nicht erstellt werden!\n");
        system("PAUSE");
        exit(0);
        }
    
     fwrite(sicher,sizeof(struct datum),sizeof(sicher)/sizeof*sicher, f);
     fclose(f);                     // File schließen
    system(" \n \n PAUSE");
    }
    

    also wenn das auch ohne Zeiger geht ist mir das fast noch lieber!

    Wäre cool wenn jemand mal ne komplette lösung mir gibt....DANKE



  • Die Anzahl auch an fwrite weitergeben: fwrite(sicher,sizeof(struct datum),n, f);



  • also wenn ich deine fwrite mit meiner ersetzte, bekomme ich immernoch den gleich scheiß fehler...

    noch ne idee???



  • Meinste den undefined reference Fehler? Da wird wohl deine Funktion nicht gefunden. Mit ner Headerdatei inkludieren oder mit extern deklarieren/bekannt machen.



  • Viperjumper schrieb:

    also wenn ich deine fwrite mit meiner ersetzte, bekomme ich immernoch den gleich scheiß fehler...

    noch ne idee???

    das Problem ist am wahrscheinlichsten hier

    fwrite(sicher,sizeof(struct datum),sizeof(sicher)/sizeof*sicher, f);
    

    denn sizeof(sicher)/sizeof*sicher ist stets konstant, und zwar 4/sizeof*sicher. sicher ist kein Arrays, sondern ein Zeiger.

    In deiner Funktion 'speichern' musst du zusätzliche die Anzahl der Elemente übergeben, dann

    void speichern(struct datum* sicher, int n, size_t len){
     ...
     fwrite(sicher,sizeof *sicher, len, f);
     ...
    }
    

    das hat dir aber Big brother schon 2 Mal gesagt, du musst nur lernen die Antworten zu lesen, sonst macht es keinen Sinn dir zu helfen.



  • und was ist jetzt meine "len"?
    wie muss ich meinen prototypen und meinen funktionsaufruf ändern?



  • und was ist jetzt meine "len"?

    len ist die Anzahl von Elementen, die du über 'sicher' übergibst.

    wie muss ich meinen prototypen und meinen funktionsaufruf ändern?

    copy & paste?



  • --



  • also der compiler bringt jetzt wenigstens keinen fehler mehr, doch steht dann nichts in der angelegtendatei drin, d.h. nur so rechteckige zeichen!!! Warum? Ist das normal?
    Habe jetzt folgenden code:

    void speichern(struct datum* sicher,int n);//Protoype
    //********************************************
    
    speichern(neu,x);//funktionsaufruf in der eingabefunktion
    //*************************************************************
    //die speicherfunktion selbst
    void speichern(struct datum* sicher,int n, size_t len){
    FILE *f;  // Zeiger auf die Struktur zur Dateibearbeitung
     f = fopen("myfile.dat", "wb"); // Datei für Schreiben öffnen
     if(f == NULL)
        {
        printf("Datei %s kann nicht erstellt werden!\n");
        system("PAUSE");
        exit(0);
        }
    len=sizeof(sicher);//len ermitteln
     fwrite(sicher,sizeof *sicher,len, f);
     fclose(f);                     // File schließen
    system(" \n \n PAUSE");
    
    }
    


  • len=sizeof(sicher);//len ermitteln
    

    das mit der anzahl der elemente hast du noch nicht verstanden.
    nur so rechteckige zeichen drin ist normal, liest das ganze wieder ein und lass dir den inhalt anzeigen, nachdem du es mit der anzahl richtig gemacht hast.



  • ja mit der länge hab icha uch noch nicht wirklich verstanden!!!
    wie ermittele ich sonst die länge???



  • Du ermittelst sie gar nicht. Du kennst sie. Schliesslich legst Du den Speicherbereich irgendwo an.



  • hi
    möglicherweise nur für arrays

    #define array_length(x) (sizeof(x)/sizeof(x[0]))
    


  • SG1 schrieb:

    Du ermittelst sie gar nicht. Du kennst sie. Schliesslich legst Du den Speicherbereich irgendwo an.

    ja aber machmal kann doch nur eine zahl, manchmal aber auch mehrer zahlen darin stehen, zB daten[1].tag=28;

    Jetzt hab ich mal versucht die datei zu öffnen....doch er gibt mir ewig lang nur "0" aus.



  • Und, funzt? Falls noch nicht, hier hast du ein funktionierendes Beispiel:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define STRLEN_MAX 256
    
    #define READ 0
    #define SAVE 1
    
    struct Haus
    {
    	char name[STRLEN_MAX+1];
    	int nr;
    };
    
    void show ( struct Haus* p, size_t n )
    {
    	size_t i = 0;
    	while ( i<n )
    	{
    		printf("Name: %s Nummer: %d\n", p[i].name, p[i].nr );
    		i++;
    	}
    }
    
    int file_in_out ( FILE* fp, struct Haus* p, size_t n, int action )
    {
    	if ( fp == 0 )
    		return 1;
    	switch (action)
    	{
    		case READ:
    			if ( n != fread ( p, sizeof *p, n, fp ))
    				return 1;
    		break;
    
    		case SAVE:
    			if ( n != fwrite ( p, sizeof *p, n, fp ))
    				return 1;
    		break;
    	}
    	return 0;
    }
    
    int eret(char* e)
    {
    	if(e)
    		puts(e);
    	fcloseall();
    }
    
    int main()
    {
    	// Zeiger auf Datei.
    	FILE* fp = NULL;
    	// Dateiname.
    	char* filename = "haus.dat";
    	// Anzahl der Strukturen.
    	enum {n=2};
    	// Ein Strukturarray mit 2 Elementen definieren und alle Elemente mit 0
    	// initialisieren.
    	struct Haus H[n] = {0}; 
    	// Den Elementen der ersten Struktur einen Inhalt geben.
    	strncpy(H[0].name,"Haus von Nikolaus",STRLEN_MAX);
    	H[0].nr = 1;
    	// Den Elementen der zweiten Struktur einen Inhalt geben.
    	strncpy(H[1].name,"Pfefferkuchenhaus",STRLEN_MAX);
    	H[1].nr = 2;
    	// Datei erstellen
    	if ( NULL == ( fp = fopen ( filename, "wb" )))
    		return eret(strerror(errno));
    	// Strukturen speichern
    	if ( 0 != file_in_out ( fp, H, n, SAVE ))
    		return eret(strerror(errno));
    	// Datei schliessen
    	fclose(fp);
    	// Datei öffnen
    	if ( NULL == ( fp = fopen ( filename, "rb" )))
    		return eret(strerror(errno));
    	// Strukturen einlesen
    	if ( 0 != file_in_out ( fp, H, n, READ ))
    		return eret(strerror(errno));
    	// Datei schliessen
    	fclose(fp);
    	// Inhalt der Strukturen anzeigen.
    	show(H, n);
    	return 0;
    }
    

Anmelden zum Antworten