Bekomme zugriffsverletzung weiß aber nicht warum



  • //Header Dateien initiallisieren
    #include <stdio.h>
    #include <iostream.h>
    #include <conio.h>
    #include <iomanip.h>
    #include <dir.h>
    //__________________________________________________________________________________________
    struct ERGEBNIS
    {
    int anschlag;
    char name[50];
    };
    //__________________________________________________________________________________________
    //Initiallisieren der Funktionen
    
    void kopfi (void);                                                //Funktion für Kopf
    void auslesen (char *,char *, int &);                             //Funktion zum einlesen der TXT
    void zaehlen (char *,int &, int &, int &, int &, int &, int &);   //Funktion zum Zählen der Zeichen
    void ausgeben (int &, int &, int &, int &, int &, int &);         //Funktion zur Ausgabe
    void abfrage (int&);                                              //Funktion zum erneuten Einlesen
    void zahlerlosch (int &, int &, int &, int &, int &, int &);      //Funktion um Zähler auf 0
    void verzeichnis();                                               //FUnktion zum Verzeichnis einlesen
    
    //__________________________________________________________________________________________
    //MAIN
    
    int main()
    {
     char umschreib[5];
     int zahl=0;
     int zeichen =0;
     char text[1000];
     char Dateiname[50];
     int zaehler= 0, zahlen =0, Gbuch = 0, AltGr = 0, worter = 1, zbruch = 0;
     char *filename = Dateiname ;
     ERGEBNIS ergebnis [40];
     char auswahl;
     //gotoxy(5,1);
    
    for(int a=1; a<2; a*=a)                 //Auswahlmenü fuer die Aufgaben
         {
            kopfi();
            int wahl;
            cout << endl;
            cout << "    [1] Auswertung der TEXTDATEI\n\n";
            cout << "    [2] Auswertung der Verzeichnisstruktur\n\n";
            cout << "    [3] Auswertung des .RTF Dokuments\n\n\n";
            cout << "\t\t\tAuswahl: ";
            cin >> wahl;
    
                switch (wahl)
                       {
                         case 1:    //Auswertung der Textdatei
                                    clrscr();
                                    kopfi();
                                    cout << "Sie haben die Option zur Auswertung der TEXTDATEI gewaehlt\n";
                                    auslesen (text, Dateiname,zahl);
                                    zaehlen (text, zaehler, zahlen, Gbuch,AltGr, worter, zbruch);
                                    ausgeben (zaehler, zahlen, Gbuch, AltGr, worter, zbruch);
                                    zahlerlosch (zaehler, zahlen, Gbuch, AltGr, worter, zbruch);
                                    abfrage (zeichen);
                                    break;
    
                         case 2:    //Auswertung des Verzeichnis
                                    clrscr();
                                    kopfi();
                                    cout << "Sie haben die Option Auswertung des VERZEICHNIS gewaehlt\n\n\n";
                                    verzeichnis();
                                    break;
    
                         case 3:    //Auswertung des .rtf Dokuments
                                    clrscr();
                                    kopfi();
                                    cout << "Sie haben die Option Auswertung des .RTF Dokuments gewaehlt\n\n\n";
    
             default:               cout<<"\n\t\tSie haben eine falsche Tasteneingabe getaetigt!\n";
                                    cout<<"\t\t\tBitte ueberpruefen Sie Ihre Eingabe\n";
                                    cout<<"\t\tUm Ihre Eingabe zu Wiederholen bitte ENTER druecken\n\n\n";
                                    a=1;
                                    getchar();
                                    clrscr();
                                    kopfi();
                                    break;
    
                            }
                      }
    
    getchar();
    }
    
    //__________________________________________________________________________________________
    //FUNKTIONEN
    //__________________________________________________________________________________________
    
    //Funktion fuer den Kopf
    void kopfi(void)
    {
    cout << "\n\t::::: C++ Project by SASCHA WAGNER and DANIEL GRUBER :::::\n";//Header
    cout << "\t\t\tCopyright and all Rights reserved\n\n";
    cout << "\t\t       10 Minuten-Abschriftsauswertung v0.1 BETA"<<endl;
       for(int x=0; x<80; x++)           //Strichlinie HEADER
         {
           cout << "_";
         }
       cout << "\n";
    }
    
    //__________________________________________________________________________________________
    //       Funktion zur erneuten Wiederholen einer Datei einlesen
    
    void abfrage (int &zeichen)
    {
    cout<<"Moechten Sie eine weitere Datei zaehlen lassen?"<<endl<<"Fuer JA bestaedigen sie mit der <0> fuer NEIN <1>";
    cin>> zeichen;
    
    }
    //__________________________________________________________________________________________
    
    void auslesen (char *text, char *Dateiname, int &zahl)
    {
     //Variablen deklaration
     char loesch=0;           //Variable zum löschen
     char lauf[30];           //Variable Verzeichnis + Dateiname
     char pfad [27];          //Variable für das Verzeichnis
    
    cout<<endl<<endl<< "Welche Datei moechten Sie oeffnen"<<endl<<"Laufwerk(z.B. A:\\, C:\\, D:\\):"<<endl;
    gets(lauf);
    cout<< "Geben Sie den Pfad an:"<<endl<<lauf;
    gets(pfad);
    strcat(lauf,pfad);
    strcpy(Dateiname,lauf);
    
     for (int i =0; i<10000;i++)
    	{
    	text[i] = loesch;
        }
    
    FILE *ream;                                //Zum Öffnen
    if ((ream = fopen(lauf, "r")) != NULL)
    {
    fseek(ream,0,SEEK_SET);                    //Zeiger auf 0
    fread (text,9999,1,ream) ;                 //Auslesen der Textdatei + Speichern
    fclose(ream);                              //Schließt den Stream
    }
    else
    {
     cout << "Datei konnte nicht gelesen werden oder ist nicht vorhanden";
     getchar();
    }
    zahl++;
    }
    
    //__________________________________________________________________________________________
    void zaehlen (char *text,int &zaehler, int &zahlen, int &Gbuch, int &AltGr, int &worter, int &zbruch)
    {
            //Variablen deklaration
            int b,c;
    	for(int i=0; i<10000;i++)
    	{
    
    	  b = text[i];
    	  c = text [i-1];
    
              /*int bb;             //Zum herrausfinden der Ascii Codes
              bb=b;
              cout << endl << bb << " - " << b <<endl;*/
    
    	   if ( b >= 65 && b<=90 || b>= 58 && b<60 ||b>60 && b<= 93|| b>= 33 && b<=34|| b>= 36 && b<= 42|| b>= 95  && b<=96|| b>= 123 && b<126|| b==-114|| b==-103|| b==-102 || b == -77 || b == -78 || b == -75 || b == -128)
    	   {
    	   zaehler = zaehler +2;   //A bis Z Großbuchstaben Ascii
    	   }
    	   else if( b >= 97 && b<=122 || b>=48 && b<=57|| b==32|| b==35|| b>= 43 && b<=46|| b== -31|| b== -124|| b==-108|| b==-127|| b == 9 || b == -28 || b == -4 || b == -10)
    	   {
    	    zaehler++;            //A-Z Kleinbuchstaben Ascii
    	   }
    	   if (b >= 48 && b <= 57)
    		{
    		zahlen ++;       //Anzahl der Zahlen
    		}
    	   if(b >= 65 && b <= 90)
    		{
    		Gbuch ++;        //Zeilenumbruch
    		}
               if( b >= 91 && b<=93 || b>=123 && b<=126|| b>=-4&& b<= -3||b>= 63 && b<=64|| b== -46 || b >= -75 && b <= -78 || b == -128)
    		{
    		AltGr ++;       //Sonderzeichen mit AltGR
    		}
    	    if ( b==32 && c != 32 || b==10 && c != 32)
    	    {
    	    worter ++;         //Anzahl der Wörter
    	    }
                if ( b == 10)
                {
                zbruch ++;
                }
    
    	}
    
    }
    //__________________________________________________________________________________________
    void ausgeben (int &zaehler, int &zahlen, int &Gbuch, int &AltGr, int &worter, int &zbruch)
    {
     cout << endl << "Anzahl der Anschlaege:\t" << zaehler;
     cout << endl << "Anzahl der Zahlen:\t" << zahlen;
     cout << endl << "Anzahl der Grossbuchstaben:\t" << Gbuch;
     cout << endl << "Anzahl der Sonderzeichen:\t" << AltGr;
     cout << endl << "Anzahl der Woerter:\t" << worter;
     cout << endl << "Anzahl der Zeilenumbrueche:\t" << zbruch;
    
    }
    
    //__________________________________________________________________________________________
    
    void zahlerlosch (int &zaehler, int &zahlen, int &Gbuch, int &AltGr, int &worter, int &zbruch)
    {
    zaehler= 0;                  //Setzt alle Zähler auf 0
    zahlen = 0;
    Gbuch = 0;
    AltGr = 0;
    worter = 1;
    zbruch = 0;
    }
    
    //__________________________________________________________________________________________
    
    void verzeichnis(void)
    {
    
         //Variablen deklaration
        ERGEBNIS erg;                      //Variable für das speichern der ergebnisdatei
        FILE *Datei;                       //Variable zum speichern der ergebnisdatei
        ffblk Datein;                      //Variable für die Funktion findfirst() bzw. findnext()
        char Pfad1[256];                   //Variable zum zwischenspeichern des pfades
        char Pfad[256];                    //Variable zum eingeben des Pfades
        char Pfaderg[256];                 //Variable zum eingeben des Zielorts der Ergebnisdatei
        char Dateityp[20]="*.txt";         //Variable für den Dateityp
        char lauf[256];                    //Variable zum öffnen der mit findfirst() gefundenen datein
        char text[1000];                   //Variable zum Speichern des Textes
        int b,i=0;                         //Variablen zum zaehlen
        int done;                          //Variabel die für findfirst benötigt wird
        int zaehler=0;                     //Variable zum zählen der der textdatein
        int Anzahl=0;                      //Variable zum zaehlen der Datein im Verzeichnis
    
        cout << "Pfad angeben: ";
        gets(Pfad);                        //Pfadeingabe für findfirst
        cout << "Pfad und Dateiname für die Ergebnisdatei: ";
        gets(Pfaderg);                     //Pfadeingabe für die ERgebnisdatei
    
        strcpy(Pfad1,Pfad);                //zwischenspeichern des Pfads
        strcat(Pfad,Dateityp);             //anhängen des Dateityps an den Pfad für die findfirst funktion
        done = findfirst(Pfad,&Datein,0);  //ausführen der findfirst funktion
        while (!done)
        {
              for (int i=0;i<1000;i++)     //Variable Text mit NULL füllen
              text[i]=NULL;
              strcpy(lauf,Pfad1);          //kopierens des Pfades für das öffnen der gefunden datei
              strcat(lauf,Datein.ff_name); //anhängen des Dateinamen an den pfad
              FILE *ream;
              ream = fopen(lauf, "r");     //öffnen der gefunden datei und auslesen
              fseek(ream,0,SEEK_SET);
              fread (text,999,1,ream) ;
              fclose(ream);                //schliesen des streams
              zaehler=0;                   //zaehler auf 0 setzten
    
              //Zaehlen der Anschläge in der Datei
              for(int i=0; i<1000;i++)
              {
              b = text[i];
    
    	   if ( b >= 65 && b<=90 || b>= 58 && b<60 ||b>60 && b<= 93|| b>= 33 && b<=34|| b>= 36 && b<= 42|| b>= 95  && b<=96|| b>= 123 && b<126|| b==-114|| b==-103|| b==-102 || b == -77 || b == -78 || b == -75 || b == -128)
    	   {
    	    zaehler = zaehler +2;
    	   }
    	   else if( b >= 97 && b<=122 || b>=48 && b<=57|| b==32|| b==35|| b>= 43 && b<=46|| b== -31|| b== -124|| b==-108|| b==-127|| b == 9 || b == -28 || b == -4 || b == -10)
    	   {
    	    zaehler++;
    	   }
               }
               //Ende des Zaehlens
               Anzahl++;                  //Anzahl 1 hochzaehlen um die Datein zu zaehlen
               strcpy(erg.name,Datein.ff_name);   //kopieren des dateinamen in den struct zum speichern
               erg.anschlag = zaehler;            //kopieren der anschläge in den struct zum speichern
               if ((Datei = fopen(Pfaderg, "w")) != NULL)  //öffnen des streams zum speichern der datei
               {
                  fwrite(&erg,sizeof(ERGEBNIS),1,Datei);   //speichern des dateinamen und der anschläge in die angegebenen ergebnisdatei
               }
               else
               {
                   cout << "speichern fehlgeschlagen\t\t";
               }
               fclose (Datei);                             //schliesen des streams
               cout << Datein.ff_name << "\t\t" << zaehler<< endl;     //ausgabe des dateinamen und der anschläge
              done = findnext(&Datein);               //suchen der nächsten datei
        }
    
        cout << "Anzahl der Datein: " << Anzahl;       //ausgabe der anzahl der datein
    
        getchar();
    
    }
    

    das programm soll zeichen in einer TXT datei lesen können.
    hat bis gestern auch noch funktioniert nur gerade nach den auskommentieren und dann beim versuch was geht was nicht geht das im switch die 1 nicht.
    sprich die einzelne .txt datei auslesen.
    er kann nur txt auslesen

    brauche dringend hilfe

    danke



  • mit lesen meine ich das der mir anzeigt wie oft großbuchstaben,kleinbuchstaben,sonderzeichen usw. in der txt datei stehen



  • gruber2k2 schrieb:

    das programm soll zeichen in einer TXT datei lesen können.
    hat bis gestern auch noch funktioniert nur gerade nach den auskommentieren und dann beim versuch was geht was nicht geht das im switch die 1 nicht.
    sprich die einzelne .txt datei auslesen.
    er kann nur txt auslesen

    brauche dringend hilfe

    danke

    WHAT !? Bitte formuliere deine Frage mal deutlicher mit Groß- und Kleinschreibung und Satzzeichen. Vielleicht versteht man dann, was dein Problem ist.

    edit: Du schreibst "Zugriffsverletzung". Wie sehen die Fehlermeldungen aus? Was geht exakt nicht?



  • es kommt die fehler meldung das die exe Datei ein problem verursacht

    zugriffverletzung bei 0x000000000 usw....

    Das Problem tritt aber nur auf, wenn ich nach dem Starten des Programmes die Option
    Auswerten einer Textdatei ausgewählt habe.
    DAnn lässt er mich den pfad der Textdatei eingeben und dann wenn er mir anzeigen sollte wieviele Zeichen in dieser Datei enthalten sind, taucht diese Fehler meldung auf



  • musste mal mit 'nem debugger rangehen



  • @winheis: sobald ich an den Punkt ankomme taucht die Fehlermeldung auf und der Borland Builder verabschiedet sich



  • Du hättest ja auch mal mit dem Debugger in die Funktion Auslesen gehen können.
    Da steht das hier

    for (int i =0; i<10000;i++)
        {
        text[i] = loesch;
        }
    

    text ist aber nur für 1000 Elemente deklariert.
    Was soll das ganze überhaupt? Zum leeren von text reicht auch text[0] = '\0';
    Was soll das hier
    for(int a=1; a<2; a*=a)
    Soll das eine Endlosschleife sein?
    da wäre for(;;) einfacher.
    Du würdest dir das Leben viel einfacher machen, wenn du statt FILE und Co streams und statt char[] string verwenden würdest.
    Warum gets und nicht cin?
    Die Header sind ebenfalls veraltet.



  • char text[10000];
    

    so muss es ausschauen

    nicht so wie

    char text[1000];
    

    es hat eine 0 gefellt da er bei der Funktion

    for (int i =0; i<10000;i++)
        {
        text[i] = loesch;
        }
    

    hier geht er 10000 mal durch und löscht 10000 mal und da dort vorher nur 1000 freigegeben waren tauchte auch dort die fehlermeldung auf.

    und wegen gets statt cin frage micht nicht das hat mein partner gemacht.
    ging so am schnellsten

    und wir können noch net alles wissen haben erst sei ca nen halben jahr c++

    Aber danke für die Hilfe hat mein Problem gelöst



  • du kannst auch statt

    char text[10000];
    
    //...
    
    for (int i =0; i<10000;i++)
        {
        text[i] = loesch;
        }
    

    Mit Symbolischen Konstanten (defines) arbeiten. Das verringert die Fehleranfälligkeit:

    #define GroesseText    10000
    
    char text[GroesseText];
    
    //...
    
    for (int i =0; i<GroesseText;i++)
        {
        text[i] = loesch;
        }
    

    Denk aber drann das hinter dem define kein Semikolon stehen darf. Die Symbolische Konstanten (GroesseText) wird nämlich beim Kompilieren durch den angegebenen Wert (10000) ersetzt.



  • Urgs...

    In C++ benutzen wir da bitte (static) const int's für, und kein #define 😉

    const int groesseText = 10000;
    
    char text[groesseText];
    

Anmelden zum Antworten