Adressen Programm, komm nicht weiter...
-
Moin liebe C Community,
ich habe ein Programm geschrieben das mehrer Adressen in eine Datei schreiben kann und auch wieder auslesen kann. Das alles hab ich leider nur mit einer Adresse geschafft.
Ich hab den Code mal so kommentiert das ich hoffe ihr versteht was ich vorhatte und meinte.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 64 //immer vielfaches von 8 /* Struktur für Adresse anlegen, */ struct adres { char vname[MAX]; char nname[MAX]; char str[MAX]; int hnr; int plz; char ort[MAX]; }; struct adres adresse; //soll eigentlich struct adres adresse[20] rein damit bis zu 20 Strukturen verwaltet werden können //aber erstmal so da keine ausführung durchführbar ist void datenanlegen(void) //daten werden ich die struktur adres adresse "geschoben" { printf("Bitte geben Sie Ihre Adresse an!\n"); printf("Vorname : "); scanf("%s",adresse.vname); printf("Nachname : "); scanf("%s", adresse.nname); printf("Strasse : "); scanf("%s", adresse.str); printf("Hausnummer : "); scanf("%i", &adresse.hnr); printf("Postleitzahl : "); scanf("%i", &adresse.plz); printf("Wohnort : "); scanf("%s", adresse.ort); printf("\nDaten in Struktur uebernommen!"); } /* Ausgabe struktur - nur zum testen, hat nichts mit IO-Datei zu tun */ void ausgabeStruct() { printf("Vorname: %s\n", adresse.vname); printf("Nachname: %s\n", adresse.nname); printf("Strasse: %s\n", adresse.str); printf("Hausnummer: %i\n", adresse.hnr); printf("PLZ: %i\n", adresse.plz); printf("Ort: %s\n", adresse.ort); printf("\nStruktur ausgegeben!"); } /* Ausgabe von Datei freopen("C:\\adresse"; "a+", stdout); printf("Umleitung in txt Datei \"C:\\adresse\"\n"); evtl zu gebrauchen für Funktion */ void ausgabeFile() //read file //benötigt noch ein parser der den text nach dem trennzeichen ";" sucht und passend ausgibt //pro sturktur dann eine Zeile in der TXT-Datei { FILE *file = fopen("C:\\adresse.txt", "r"); //r = nur lesen char puffer[MAX]; //puffer der die Zeilen aus Datei zwischenspeichert-> max länge der Zeile ist MAX=64 if(NULL == file) { printf("\nKonnte Datei adresse.txt nicht oeffnen!\n"); } while(fgets(puffer, MAX, file) != NULL) { printf("%s", puffer); } printf("************************"); fclose(file); printf("\nDateiinhalt ausgegeben"); } /* speichern in datei */ void saveStruct() { FILE *file = fopen("C:\\adresse.txt", "w+"); if(NULL == file) { printf("Dateizugriff verweigert...\n"); } else { fprintf(file, "%s;", adresse.vname); fprintf(file, "%s;", adresse.nname); fprintf(file, "%s;", adresse.str); fprintf(file, "%i;", adresse.hnr); fprintf(file, "%i;", adresse.plz); fprintf(file, "%s;\n", adresse.ort); fclose(file); printf("\ngespeichert!"); } } /* struktur befüllen -> damit nicht immer alles neu von hand eingegeben werden muss -> zum testen */ void befuellen() { strcpy(adresse.vname, "MAX"); strcpy(adresse.nname, "MUSTERMAN"); strcpy(adresse.str, "Musterweg"); adresse.hnr = 29; adresse.plz = 12345; strcpy(adresse.ort, "Musterhausen"); } /* Daten speichern / anhängen */ void weiterStruct() //wird später glaub nicht mehr benötigt { FILE *file = fopen("C:\\adresse.txt", "a"); // a = end of file | nicht überschreiben der schon vorhandenen daten if(NULL == file) { printf("Dateizugriff verweigert...\n"); } else { fprintf(file, "%s;", adresse.vname); fprintf(file, "%s;", adresse.nname); fprintf(file, "%s;", adresse.str); fprintf(file, "%i;", adresse.hnr); fprintf(file, "%i;", adresse.plz); fprintf(file, "%s\n", adresse.ort); fclose(file); printf("default Werte gespeichert gespeichert!"); } } /* Anfang - Start */ int main() { int a; int nochmal = 0; while(nochmal == 0) { printf("\n\nWas wollen Sie tun?\n\n"); printf("- 1.) Datensatz anlegen\n"); printf("---- 2.) Datensatz anzeigen (Struktur)\n"); printf("- 3.) Datensatz anzeigen (Datei)\n"); printf("- 4.) Datensatz neu speichern\n"); printf("-----5.) Befuellen (Struktur)\n"); printf("- 6.) Daten Speichern / Anhaengen\n"); printf("- 0.) Programm beenden\n"); printf("\nIhre Auswahl: "); scanf("%d", &a); printf("*****************"); switch(a) { case 1: system("cls"); //cls = leert das fenster printf("\n\n...Datensatz anlegen\n\n"); datenanlegen(); break; case 2: system("cls"); printf("\n\n...Inhalt der Struktur\n\n"); ausgabeStruct(); break; case 3: system("cls"); printf("\n\n...Inhalt der Datei\n\n"); ausgabeFile(); break; case 4: system("cls"); printf("\n\n...wird gespeichert"); saveStruct(); break; case 5: system("cls"); printf("\n\n...Struktur wird befuellt"); befuellen(); break; case 6: system("cls"); printf("\n\n...Daten angehängt"); weiterStruct(); break; case 0: system("cls"); printf("\n\n...schoenen Tag noch\n\n"); nochmal = 1; break; default: printf("\n\n\nFalsche Eingabe! Achten Sie auf die Auswahlmoeglichkeit\n\n\n"); } } return 0; }
Ich hoffe ihr könnt mir helfen...
-
adressen_andy schrieb:
Das alles hab ich leider nur mit einer Adresse geschafft.
was passiert denn mit den anderen adressen?
-
Da ich es nicht über mehrer strukturen hinbekomme eigentlich gar nix...wenn ich es normal speichern will überschreibt jede adressen-eingabe die alte (is auch so geplant durch w+)....deshalb hab ich ja noch eine funktion "weiterStruct();" angehängt.
Allerding´s will ich die gar nicht reinhaben sondern das programm eben über mehrer strukturen "struct adres adresse[20]" verwirklichen.
Es soll quasi pro adressen-eingabe eine zeile in die datei geschrieben werden. (mit dem trennzeichen ";" der einzelnen ??sturkturelemente(name,plz usw..)??)
-
adressen_andy schrieb:
Allerding´s will ich die gar nicht reinhaben sondern das programm eben über mehrer strukturen "struct adres adresse[20]" verwirklichen.
dann probier mal das:
fwrite (adresse, sizeof(struct address), 20, file);
^^statt deiner vielen fprintfs.
-
und die 20 aus
fwrite (adresse, sizeof(struct address), 20, file);
durch ne variable ersetzten und hochzählen lassen nach jeder adresseneingabe?...bin absoluter C vollidiot sag ich mal...leider
-
Is besser ... speichere die structs so wie sie im Memory liegen. Dann kannste auch das Adressenarray komplett schreiben und komplett wieder so einlesen.
-
adressen_andy schrieb:
und die 20 aus
fwrite (adresse, sizeof(struct address), 20, file);
durch ne variable ersetzten und hochzählen lassen nach jeder adresseneingabe?...bin absoluter C vollidiot sag ich mal...leider
nee, nur einmal fwrite aufrufen. schau mal hier: http://www.cplusplus.com/reference/clibrary/cstdio/fwrite.html