Dateispeichern mit fwrite!
-
Hi !
Wenn die Arrays korrekt terminiert sind, wird auch nur bis zum '\0' Terminator ausgegeben.
Ansonsten sollte man Variable vor der Benutzung Initialisieren.int main() { struct adressverwaltung schrott_im_ram; struct adressverwaltung clean_init = { 0 }; char char_schrott[100]; char char_clean [100] = "\0"; puts("*** SCHROTT AREA *** "); printf("%s %s %s %s %ld\n", schrott_im_ram.adresse, schrott_im_ram.name, schrott_im_ram.telefon, schrott_im_ram.wohnort ,schrott_im_ram.next); puts(char_schrott); puts(""); puts("*** CLEAN AREA *** "); puts(char_clean); printf("%s %s %s %s %ld\n", clean_init.adresse, clean_init.name, clean_init.telefon, clean_init.wohnort, clean_init.next);// Die Null ist der Zeiger auf 0 return 0; }
-
Shortylee schrieb:
...Wenn jetzt zb. ein Name mit 10 Zeichen im String stehen, dann ist der rest immer noch mit anderem Gedusel ausm Speicher belegt.
Ich frage mich gerade, wie du das eingelesen hast ?
Shortylee schrieb:
Frage: wie leere ich den freigegeben Speicher? Damit nur das im String steht was auch eingegeben wurde und der Rest des Strings auch wirklich leer ist.
Char-array Speicher brauchst du nicht zu leeren.
Ach und zwei Dinge noch am Rande: Deine printf- Anweisung, das korrekt gespeichert wurde, wird immer aufgerufen.
Und erklären schreibt man ohne h
Gruß, p.
-
Danke für deine Hilfe!
Doch wie initialisiere ich über den Pointer(first,adress_ptr) die Variablen aus der Struktur auf die gerade der Pointer zeigt?
In deinem Beispiel hast du keinen Pointer benutzt.
struct adressverwaltung clean_init = { 0 };
Ich frage mich gerade, wie du das eingelesen hast ?
Ich habe in der Struktur die strings nur 6 zeichen lang gemacht und ein Wort eingeben, dass nur 5 Zeichen lang ist. Da er mir nur mein eingegebenes Wort ausgegeben hat dachte ich mir, dass der Rest nur Müll sein kann aus dem Speicher.
-
Die Zeile:
struct adressverwaltung clean_init = { 0 };
Initialisiert alle Variablen der Struktur, der Zeiger wird mit 0 belegt.
-
Hab, meiner Meinung nach, ne bessere Variante gefunden!
Statt "fwrite" zu benutzen und alle Variablen zu initialisieren, habe ich "fputs" benutzt.fputs=(adress_ptr->name,f); ...
Dieser gibt dann auch wirklich nur den String aus.
Trotzdem danke ich dir vielmals für deine Unterstützung und bin froh solch eine Hilfsplattform gefunden zu haben.
MFG
Shorty
-
Jo, oki dok, nichts zu danken.
Bloß, wenn du die Werte wieder aus der Datei in deine Struktur einlesen willst dann wirds schief gehen.
-
Hi !
Ich habs mir noch einmal genauer angeguckt und
das hier:struct adressverwaltung clean_init = { 0 };
bringt nur scheinbar eine saubere Initialisierung.
Wenn man mit dem Debugger durchgeht, sieht alles schön sauber Initialisiert aus,
aber beim Speichern wird immer noch Schrott in die Datei ausgegeben.Dann hab ich die Struktur mit dem memset-Befehl Initialisiert und etwas in eine Datei geschrieben.
( struct adressverwaltung *next = 0 )
Dann steht auch kein Schrott in der Datei !... memset( adress_ptr, 0, sizeof( struct adressverwaltung ) ); ...
-
Super!
Klappt wunderbar!Das Problem an der ganzen Geschichte mit fwrite ist, dass er die nicht benutzten char's (die nun initialisiert sind mit ' ') trotzdem mit in die Datei schreibt.
Bedeutet bei folgender Struktur:
struct adresse { char name[20]; char strasse[20]; }
folgendes Ergebnis in der gespeicherten Datei mit den Werten:
name = "Pascal";
strasse = "strasse";"
Pascal
(-------------)strasse
(------------)"Dieses Problem habe ich nur durch fputs beseitigen können.
Doch, wie du schon gesagt hattest, gibs Probleme beim laden der Strukturen.Ich werde deswegen mich mit C-API auf MySQL zutrauen. Find ich sowieso viel effizienter
. Doch dafür muss ich erstmal wieder viel lesen.
MFG
Shorty
-
Ja, fwrite() schreibt genau die angeforderte Anzahl an Bytes, ohne sich um den Inhalt zu kümmern - und dein struct besteht aus 40 Bytes (2 Arrays à 20 Zeichen), die auch genau so geschrieben werden. Wenn du nur den relevanten Teil der structs schreiben willst, mußt du die Größenangaben entsprechend anpassen:
fwrite(adr.name,strlen(adr.name),1,datei); fwrite(adr.strasse,strlen(adr.strasse),1,datei);
-
< all problems solved > ?
Super!
Nu kann ich die Datei auch mit dem Notepad öffnen!
edit:
So wie es aussieht erreiche ich mit:
fwrite(adress_ptr->name,strlen(adress_ptr->name),1,f);
genau das gleiche, wie mit:
fputs(adress_ptr->name,f);
hier mal die Load-Funktion:
void load_adresse() { FILE *f; char dateiname[255]; struct adressverwaltung *adress_ptr, adress_daten; printf("Welchen Datensatz wollen Sie laden : "); scanf("%s",dateiname); fflush(stdin); f = fopen(dateiname, "r"); if(f == NULL) { printf("Fehler beim oeffnen von %s\n",dateiname); return; } while(fread(&adress_daten,sizeof(struct adressverwaltung),1,f)) { if(first == NULL) { first = (struct adressverwaltung *)malloc(sizeof(struct adressverwaltung)); memset( first, 0, sizeof( struct adressverwaltung ) ); if(first == NULL) { printf("Speicherplatzmangel!!!\n"); exit(0); /* Programm beenden */ } else { strcpy(first->name, adress_daten.name); strcpy(first->adresse, adress_daten.adresse); strcpy(first->wohnort, adress_daten.wohnort); strcpy(first->telefon, adress_daten.telefon); first->next = NULL; } } else { adress_ptr=first; while(adress_ptr->next != NULL) adress_ptr = adress_ptr->next; adress_ptr->next = (struct adressverwaltung *)malloc(sizeof(struct adressverwaltung)); memset( adress_ptr->next, 0, sizeof( struct adressverwaltung ) ); if(adress_ptr->next == NULL) { printf("Speicherplatzmangel!!!\n"); exit(0); /* Programm beenden */ } else { adress_ptr = adress_ptr->next; strcpy(adress_ptr->name, adress_daten.name); strcpy(adress_ptr->adresse, adress_daten.adresse); strcpy(adress_ptr->wohnort, adress_daten.wohnort); strcpy(adress_ptr->telefon, adress_daten.telefon); adress_ptr->next = NULL; } } } printf("\nDatensatz geladen\n\n"); }
Tut mir leid falls ich gerade aufn Schlauch stehe.