Hilfe zum Thema Adressverwaltung



  • Sorry dass ich jetzt erst schreibe! Normalerweise bekomm ich immer ne Mail, aber diesmal irgendwie nicht.

    Fehler:
    Unbehandelte Ausnahme in Test.exe: 0xC0000005: Access Violation

    Und dann will er nach dem Quellcode suchen.
    Voll Merkwürdig!

    Könntest du es noch irgendwie schaffen das hinzubekommen, also ich mein das gesamte Programm?

    Wäre voll nett!!!

    @ DJ Black Eagle:
    Also geaddet hab ich dich, wenn deine Nr. mit 113...... anfängt, musst du mich nur noch in deine Kontaktliste aufnehmen.



  • Dirk2904 schrieb:

    Unbehandelte Ausnahme in Test.exe: 0xC0000005: Access Violation

    Hört sich fast danach an, dass du irgendwo ein Array hast, das meinetwegen 5 Einträge zulässt, und greifst auf das 6. zu. Geh dein Programm mal mit dem Debugger Schritt für Schritt durch, damit du merkst, wo dieses Array ist.

    Dirk2904 schrieb:

    Könntest du es noch irgendwie schaffen das hinzubekommen, also ich mein das gesamte Programm?

    Ich will dir wirklich nicht schaden und dich einfach hängen lassen, aber ich hab dir doch schon gesagt, dass ich dir nicht das Programm einfach so schreibe. Für spezielle Fragen steht dir das Forum zur Verfügung. Den Rest musst du selbst machen, deshalb hast ja vermutlich auch du diese Aufgabe bekommen! 😉



  • okay, ich schaff das schon,:D
    nur eine frage hab ich momentan!
    ich hab schon wieder etwas am code geändert, hier der gesamte code:

    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
    
    int auswahl;
    int Anzahl,j,z1;
    char Namen[7][100][100];
    FILE *LeseDatei, *SchreibDatei;
    
    int Menue()
    {
    do
    {
    printf ("Menue: ein Menue fuer Adressverwaltung");
    printf ("\n 1. Namen eingeben:");
    printf ("\n 2. Namen alle ausgeben:");
    printf ("\n 3. Namen allle sortiert ausgeben:");
    printf ("\n 4. Namen suchen:");
    printf ("\n 5. Datensatz Speichern");
    printf ("\n 6. Datensatz laden.");
    printf ("\n 7. Programm (b)eenden");
    printf ("\n\n\n Bitte waehlen Sie: ");
    scanf ("%d",&auswahl);
    
    }
    while (auswahl >6);
            switch(auswahl)
    	{
    	case 1: Eingeben();
    	break;
    	case 2: Alleausgeben();
    	break;
    	case 3: Allesortieren();
    	break;
    	case 4: Suchen();
    	break;
    	case 5: Speichern();
    	break;
    	case 6: Laden();
    	break;
    	case 7: Beenden();
    	break;
    	}
    
    return 0;
    }
    
    int Eingeben()
    {
    printf ("\n\nBitte geben Sie die Anzahl der Namen ein: \n");
    scanf ("%d", &Anzahl);
    j=Anzahl;
    do
    {
    printf ("\nBitte geben Sie den Vornamen ein: \n");
    scanf ("%s", Namen[1][j]);
    printf ("\nGeben Sie den Nachnamen ein: \n");
    scanf ("%s", Namen[2][j]);
    printf ("\nBitte geben Sie die Strasse ein: \n");
    scanf ("%s", Namen[3][j]);
    printf ("\nBitte geben Sie die Hausnummer ein: \n");
    scanf ("%s", Namen[4][j]);
    printf ("\nBitte geben Sie die Postleitzahl ein: \n");
    scanf ("%s", Namen[5][j]);
    printf ("\nBitte geben Sie den Ort ein: \n");
    scanf ("%s", Namen[6][j]);
    printf ("\nBitte geben Sie Ihre Telefonnummer ein: \n");
    scanf ("%s", Namen[7][j]);
    j--;
    }
    while (j>0);
    Menue();
    return 0;
    }
    
    int Alleausgeben()
    { 
    j=Anzahl;
    do
    {
    printf ("Vorname: %s \n",Namen[1][j]);
    printf ("Nachname: %s \n",Namen[2][j]);
    printf ("Strasse: %s \n",Namen[3][j]);
    printf ("Hausnummer: %s \n",Namen[4][j]);
    printf ("Postleitzahl: %s \n",Namen[5][j]);
    printf ("Ort: %s \n",Namen[6][j]);
    printf ("Telefonnummer: %s \n",Namen[7][j]);
    printf ("\n");
    j--;
    }
    while (j>0);
    Menue();
    return 0;
    }
    
    int Allesortieren()
    {
    
    qsort(Namen[7][100][100]);
    printf ("Die Sachen sind sortiert");
    return 0;
    }
    
    int Suchen()
    {
    printf ("Die Sachen sind sortiert");
    return 0;
    }
    
    int Speichern ()
    {
    
    do
    {
    (SchreibDatei = fopen( "adressen.txt", "w+t"));
    fprintf( SchreibDatei, "%s %s %s %s %s %s %s\n", Namen[1][j], Namen[2][j], Namen[3][j], Namen[4][j], Namen[5][j], Namen[6][j], Namen[7][j] );
    fclose( SchreibDatei );
    j++;
    }
    while (j<=Anzahl);
    
    printf ("Gespeichert...\n\n\n");
    getch();
    Menue();
    return 0;
    }
    
    int Laden ()
    {
    	do
    {
    (LeseDatei = fopen( "adressen.txt", "r+t"));
    fscanf( LeseDatei, "%s %s %s %s %s %s %s \n", Namen[1][j], Namen[2][j], Namen[3][j], Namen[4][j], Namen[5][j], Namen[6][j], Namen[7][j] );
    fclose( LeseDatei );
    j++;
    }
    while (j<Anzahl);
    
    	printf ("Geladen...");
    	getch();
    	printf ("\n Gehe zurueck zum Hauptmenue \n");
    	getch();
    	Menue();
    return 0;
    }
    
    int Beenden()
    
    {
    
        Menue();
    	return 0;
    }
    
    int main()
    {
    	Menue();
    return 0;
    }
    

    nun zur frage:
    der speichert das wohl in eine datei, allerdings speichert er nur einen eintarg, will man mehr eingeben, dann speichert er nur den zuerst eingegebenen namen.
    da müsstest du mir noch mal helfen, sodass er wenigsten 10 namen speichert oder alle!



  • #include <iostream>
    #include <vector>
    #include <cstdlib>
    
    class Eintrag
    {
        private:    
                std::string VorName;
                std::string NachName;
                std::string Strasse;
                int Hausnummer;
                int PLZ;
                std::string ORT;
                long Telefon;
        public:
                std::string getVorName()
                {
                    return VorName;
                }
                void setVorName(std::string value)
                {
                    VorName = value;
                }
    
                std::string getNachName()
                {
                    return NachName;
                }
                void setNachName(std::string value)
                {
                    NachName = value;
                }
                 std::string getStrasse()
                {
                    return Strasse;
                }
                void setStrasse(std::string value)
                {
                    Strasse = value;
                } 
                  int getHausnummer()
                {
                    return Hausnummer;
                }
                void setHausnummer(int value)
                {
                    Hausnummer = value;
                } 
                 int getPLZ()
                {
                    return PLZ;
                }
                void setPLZ(int value)
                {
                    PLZ = value;
                } 
                 std::string getORT()
                {
                    return ORT;
                }
                void setORT(std::string value)
                {
                    ORT = value;
                } 
                 long getTelefon()
                {
                    return Telefon;
                }
                void setTelefon(long value)
                {
                    Telefon = value;
                } 
    
                void Eingeben()
                {	
                        std::cout << std::endl << "\nBitte geben Sie den Vornamen ein: " << std::endl;;
                        std::cin >> VorName;
                        std::cout << "Geben Sie den Nachnamen ein: " << std::endl;
                        std::cin >> NachName;
                        std::cout << "Bitte geben Sie die Strasse ein: " << std::endl;
                        std::cin >> Strasse;
    
                        std::cout << "Bitte geben Sie die Hausnummer ein: " << std::endl;
                        std::cin >> Hausnummer;
                        std::cout << "Bitte geben Sie die Postleitzahl ein: " << std::endl;
                        std::cin >> PLZ; 
                        std::cout << "Bitte geben Sie den Ort ein: " << std::endl;
                        std::cin >> ORT;
                        std::cout << "Bitte geben Sie Ihre Telefonnummer ein: " << std::endl;
                        std::cin >> Telefon;
    
               } 
               void Ausgeben()
               {
                   std::cout << std::endl << "Vorname: " << VorName << std::endl << "Nachname: "
                   << NachName << std::endl << "Strasse: " << Strasse << std::endl << "Hausnummer: " 
                   << Hausnummer << std::endl << "PLZ: " << PLZ << std::endl << "Ort: " << ORT 
                   << std::endl << "Telefonnummer: " << Telefon << std::endl;
    
               }                        
    
    };
    
    class Adressliste
    {
        private:
            std::vector<Eintrag> Adressliste;
        public:
            std::vector<Eintrag> getAdressliste()
            {
                return Adressliste;
            } 
    
            void setAdressliste(std::vector<Eintrag> adr)
            {
                Adressliste = adr;
            }
            void Eingeben()
            {
                Eintrag e;
                e.Eingeben();
                Adressliste.push_back(e);
            }
            void AllesAusgeben()
            {
                for(int i = 0;i < Adressliste.size();i++)
                {
                    Adressliste[i].Ausgeben();
                }    
            }         
    
    };
    
    int main()
    {
        Adressliste adress;
        adress.Eingeben();
        adress.Eingeben();
        adress.AllesAusgeben(); 
        std::system("Pause");   
    }    
    
    /*
    int Allesortieren()
    {
    
    return 0;
    }
    
    int Suchen()
    {
    printf ("Die Sachen sind sortiert");
    return 0;
    }
    
    */
    

    So würd ichs machen.



  • Dirk2904 schrieb:

    nun zur frage:
    der speichert das wohl in eine datei, allerdings speichert er nur einen eintrag, will man mehr eingeben, dann speichert er nur den zuerst eingegebenen namen.

    Probier mal, das fclose(...) erst nach der while-schleife zu setzen.



  • wenn ich das fclose (..) nach der while - schleife setzte dann funktioniert das auch nicht!

    hast du noch nen anderen ratschlag?



  • sicher, dass du die arrays richtig ansprichst? wie gesagt, ich hab da mein problem mit den mehrdimensionalen.



  • Mal abgesehen davon, das man dafür normalerweise in C++ ne streamklasse verwendet.
    fopen,fscanf, printf ... ist alles C.
    Was macht folgendes?

    SchreibDatei = fopen( "adressen.txt", "w+t")
    

    Jedesmal wird eine neue adressen.txt gespeichert. Die alte adressen.txt wird überschrieben.
    also aus "w+t" ein "a+" machen.



  • wird bei "a+" nicht einfach nur angehängt und ein zusätzlicher lesezugriff gestattet? wozu ein lesezugriff? ist es nicht schlauer, ein "w" zu schreiben, damit immer eine neue datei angelegt wird?



  • Ich will dich jetzt nicht verwirren und wenn du das was ich schreibe nicht verstehst dann ist es auch egal, aber an deiner Stelle würde ich für die Aufgabe eine doppelt verkettete Liste nehmen.
    Ist imho das leichteste (wenn man es kann) und eleganteste.



  • Praktikant schrieb:

    wird bei "a+" nicht einfach nur angehängt und ein zusätzlicher lesezugriff gestattet? wozu ein lesezugriff? ist es nicht schlauer, ein "w" zu schreiben, damit immer eine neue datei angelegt wird?

    Mal ne Überlegung:
    Daten suchen
    Bisher wollt ihr das so machen, das ihr alle Adressen in den Speicher schaufelt, und dann im Speicher das Array durchsucht.
    Wozu sich den Speicher vollmüllen ?
    Warum nicht einfach nur die Datei durchsuchen.

    Daten speichern
    Bisher löscht ihr die alte Adress Datei und damit alle bisher gespeicherten Adressen und erzeugt eine neue, und schreibt dann alles was im Array steht in die Datei.
    Warum die alten Adressen löschen ?
    Einfach mit "append" (fopen("Adress.txt","a" bzw "a+")) neue Daten "hinten" anhängen und die alten Daten unangetastet lassen.



  • AS106 schrieb:

    Ich will dich jetzt nicht verwirren und wenn du das was ich schreibe nicht verstehst dann ist es auch egal, aber an deiner Stelle würde ich für die Aufgabe eine doppelt verkettete Liste nehmen.
    Ist imho das leichteste (wenn man es kann) und eleganteste.

    naja ganz versteh ich dich nicht. und außerdem kann ich kein imho programmieren. hab also kein plan wie das funktioniert. 🙄

    greeneagle schrieb:

    Mal ne Überlegung:
    Daten suchen
    Bisher wollt ihr das so machen, das ihr alle Adressen in den Speicher schaufelt, und dann im Speicher das Array durchsucht.
    Wozu sich den Speicher vollmüllen ?
    Warum nicht einfach nur die Datei durchsuchen.

    Daten speichern
    Bisher löscht ihr die alte Adress Datei und damit alle bisher gespeicherten Adressen und erzeugt eine neue, und schreibt dann alles was im Array steht in die Datei.
    Warum die alten Adressen löschen ?
    Einfach mit "append" (fopen("Adress.txt","a" bzw "a+")) neue Daten "hinten" anhängen und die alten Daten unangetastet lassen.

    ich versuch das mal hinzubekommen! Morgen muss ich das allerdings abgeben. 😞

    Praktikant schrieb:

    Probier mal, das fclose(...) erst nach der while-schleife zu setzen.

    ehm, merkwürding ich hab es nochmal ausprobiert und nun klappt das!
    Danke 🙂 !!!



  • Hi Praktinkant, brauch nun zum letzten mal deine hilfe!

    Das ist mein Programm:

    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
    
    int auswahl;
    int Anzahl,j,z1;
    char Namen[7][100][100];
    FILE *LeseDatei, *SchreibDatei;
    
    int menue()
    {
    
    do
    {
    printf ("\n\n\nHauptmenue: ");
    printf ("\n 1. Namen eingeben:");
    printf ("\n 2. Namen alle ausgeben:");
    printf ("\n 3. Datensatz speichern");
    printf ("\n 4. Datensatz laden.");
    printf ("\n 5. Programm Beenden");
    printf ("\n\n\n Bitte waehlen Sie: ");
    scanf ("%d",&auswahl);
    
    }
    while (auswahl >5);
    switch(auswahl)
    {
    case 1: eingabe();
    break;
    case 2: ausgabe();
    break;
    case 3: speichern();
    break;
    case 4: laden();
    break;
    case 5: beenden();
    break;
    }
    return 0;
    }
    
    int eingabe()
    {
    printf ("\n\nBitte geben Sie die Anzahl der Namen ein: \n");
    scanf ("%d", &Anzahl);
    j=Anzahl;
    do
    {
    printf ("\nBitte geben Sie den Vornamen ein: \n");
    scanf ("%s", Namen[1][j]);
    printf ("\nGeben Sie den Nachnamen ein: \n");
    scanf ("%s", Namen[2][j]);
    printf ("\nBitte geben Sie die Strasse ein: \n");
    scanf ("%s", Namen[3][j]);
    printf ("\nBitte geben Sie die Hausnummer ein: \n");
    scanf ("%s", Namen[4][j]);
    printf ("\nBitte geben Sie die Postleitzahl ein: \n");
    scanf ("%s", Namen[5][j]);
    printf ("\nBitte geben Sie den Ort ein: \n");
    scanf ("%s", Namen[6][j]);
    printf ("\nBitte geben Sie Ihre Telefonnummer ein: \n");
    scanf ("%s", Namen[7][j]);
    j--;
    }
    while (j>0);
    menue();
    return 0;
    }
    
    int ausgabe()
    { 
    j=Anzahl;
    do
    {
    printf ("Vorname: %s \n",Namen[1][j]);
    printf ("Nachname: %s \n",Namen[2][j]);
    printf ("Strasse: %s \n",Namen[3][j]);
    printf ("Hausnummer: %s \n",Namen[4][j]);
    printf ("Postleitzahl: %s \n",Namen[5][j]);
    printf ("Ort: %s \n",Namen[6][j]);
    printf ("Telefonnummer: %s \n",Namen[7][j]);
    printf ("\n");
    j--;
    }
    while (j>0);
    menue();
    return 0;
    }
    
    int speichern ()
    {
    SchreibDatei = fopen( "adressen.txt", "w+t");
    do
    {
    fprintf( SchreibDatei, "%s %s %s %s %s %s %s\n", Namen[1][j], Namen[2][j], Namen[3][j], Namen[4][j], Namen[5][j], Namen[6][j], Namen[7][j] );
    j++;
    }
    while (j<=Anzahl);
    fclose( SchreibDatei );
    printf ("Gespeichert...\n\n\n");
    getch();
    menue();
    return 0;
    }
    
    int laden ()
    {
    do
    {
    (LeseDatei = fopen( "adressen.txt", "r+t"));
    fscanf( LeseDatei, "%s %s %s %s %s %s %s \n", Namen[1][j], Namen[2][j], Namen[3][j], Namen[4][j], Namen[5][j], Namen[6][j], Namen[7][j] );
    fclose( LeseDatei );
    j++;
    }
    while (j<Anzahl);
    printf ("Geladen...");
    getch();
    printf ("\n Gehe zurueck zum Hauptmenue \n");
    getch();
    menue();
    return 0;
    }
    
    int beenden()
    
    {
    printf ("\nAuf Wiedersehen und bis zum naechsten mal\n");
    printf ("\nWeiter mit beliebiger Taste!");
    getch ();
    printf ("\n\n\n\n\n Copyright 2004 by Mathias Nee und Dirk Wichers");
    getch ();
    return 0;
    }
    
    int main()
    {
    menue();
    return 0;
    }
    

    füg jetzt mal bitte meinen code in deinen compiler ein mach dann folgendes:
    1. kompelieren und programm starten
    2. "namen eintragen" aus dem menü auswählen
    3. anzahl der namen eintragen (1-2 namen)
    4. alles soweit eingeben
    5. das porgramm speichern
    6. das programm beenden
    7. erneut kompilieren und das programm starten
    8. "laden" im hauptmenü auswählen
    und nun müsstest du folgende fehler wie ich haben:

    Unbehandelte Ausnahme in Test.exe:0x0000005 Access Violation.

    und dann will er denn quellcode suchen!

    keine ahnung woran das liegt.

    ws muss nur noch das laden funktionieren, dann ist alles perfekt.
    Versuch das bitte noch hinzubekommen, denn ich muss das morgen abgeben. 😞



  • ich habs grad noch ne halbe stunde lang probiert, aber bin leider zu keinem ergebnis gekommen.

    ich hab die zeile

    fscanf( LeseDatei, "%s %s %s %s %s %s %s \n", Namen[1][j], Namen[2][j], Namen[3][j], Namen[4][j], Namen[5][j], Namen[6][j], Namen[7][j] );
    

    mal durch die zeile

    fscanf(LeseDatei, "%s %s %s %s %s %s %s \n", a,b,c,e,d,f,g);
    

    ersetzt. da gings ohne probleme. bei deiner lösung kommt aber auch diese zugriffsverletzung bei mir.
    wie gesagt, diese mehrdimensionalen arrays mag ich nicht. hier wieder ein beispiel, warum nicht.

    eine andere sache ist mir beim laden noch aufgefallen. die schleife läuft ja über eine do-statement. das j ist am anfang nicht gesetzt (j=0) und das Anzahl ist auch nicht gesetzt. die schleife dürfte also gar nicht so ordentlich laufen.

    sorry, dass ich dir nicht wirklich helfen konnte, aber alles andere funktioniert ja.
    😞



  • Hallo Zusammen!
    Gute Nachrichten, unser Lehrer ist heute krank, 😃
    d.h. dass wir das porgramm erst in zwei wochen abgeben müssen.

    So, wir sitzen gerade in'ner schule vor den rechnern und tüffteln gerade wieder an dem programm herum. scheint als würden wir das noch hinbekommen (speichern, laden, etc.) 😉



  • Moin Leude!

    Mein Pauker hat gerade das programm bewertet 😃

    84 % hab ich dafür bekommmen, das heißt ne glatte 2 😃 😃 😃

    Vielen Dank nochmal für eure Hilfe!
    Man sieht sich

    Dirk


Anmelden zum Antworten