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 auslesenbrauche 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 auslesenbrauche 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 hierfor (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 schnellstenund 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];