Woodstock Geschrieben 27. Februar 2002 Geschrieben 27. Februar 2002 Hallo! Ich habe da ein Problem, was etwas größeren Umfangs ist. Und zwar habe ich ein Programm geschrieben welches alle Textdateien auf der Festplatte oder in einem Ordner sucht (je nach dem was der User eingibt) und alle Wörter da raus in eine andere Textdatei schreibt. Hinter den Wörtern (die jeweils nur einmal vorkommen) werden Zahlen geschrieben. Diese Zahlen stehen für Zeilen aus eine dritten Textdatei wo die gefunden Dateien mit Pfadangabe rein geschrieben werden. Das Prinzip ist also: Wort wird gefunden -> Wort wird in Index Datei geschrieben -> Zahl der Zeile wird dahinter geschrieben -> Datei mit Pfad wird in die Pfaddatei geschrieben. Pro Zeile steht nur ein Wort und in der Pfaddatei steht nur eine Datei mit Pfad pro Zeile. Kein Wort ist doppelt, keine Datei doppelt. Kommt ein Wort in einer weiteren Datei vor, wird nur die Zahl der Datei an die Zeile des Wortes angehängt. Beispiel: Index Datei: Wort 1 2 5 Hallo 2 3 4 5 Ja 3 5 Pfad Datei: c:\bla.txt c:\windows\registry.txt c:\windows\log.txt c:\personal\Test.txt c:\programme\liesmich.txt Daran sieht man dann dass das Wort Wort in c:\bla.txt, c:\windows\registry.txt und c:\programme\liesmich.txt vorkommt usw. Soweit so gut. Wenn ich nur einen Ordner durchsuchen lasse, dann klappt es wunderbar. Wenn ich aber die ganze Festplatte durchsuchen lasse, dann schreibt er mir die Wörter insgesamt drei Mal in die Index Datei, also so: Wort 1 2 5 Hallo 2 3 4 5 Ja 3 5 Wort 1 2 5 Hallo 2 3 4 5 Ja 3 5 Wort 1 2 5 Hallo 2 3 4 5 Ja 3 5 Und ich weiß einfach nicht wieso. Anbei meine Quelltexte: Sabine.h #include <stdio.h> #include <iostream.h> #include <string.h> #include <io.h> #include <math.h> #include <stdlib.h> void FileSearch(const char* pszPfad1, char *szBuffer3, long& lLineNumber); void GetWords(char *b, long& lLineNumber, int &k); void Ueberpruefung(char *pszWort, long lDateinummer, int &k); void WritePath(char *b, long &lLineNumber, bool &fFound); void Linenumber(long &lLineNumber); [/PHP] [PHP] Index.cpp #include "SabineIndex.h" void main(int argc, char *argv[], char *envp[]) { FILE *FY; char szBuffer3[1001]={NULL}; char szIndex[]={"c:\\Index.txt"}, szIndexTemp[]={"c:\\IndexTemp.txt"}, szPfad[]={"c:\\Pfad.txt"}, szPfadTemp[]={"c:\\PfadTemp.txt"}; int nA = 1; long lLineNumber=1; char Pfad[500]={NULL}; FILE *Pfad1, *Index; cout << argc << "\n"; if (argc == 1) { cout << "\033[2J"; cout << "\n\n"; cout << "Dieses Programm erstellt eine Datei welche alle Woerter die in Dateien auf Ihrer Festplatte\n" "vorhanden sind enthaelt. Zusaetzlich werden die Dateien in denen die Woerter vorkommen mit\n" "angegeben\n"; cout << "Brauchen Sie Hilfe zur Benutzung des Programms, rufen Sie das Programm mit dem\n" "Parameter '/?' oder '/h' auf!\n\n\n"; nA = 0; } if (!nA) exit(1); if ((strcmp(argv[1], "/?") == 0) || (strcmp(argv[1], "/h") == 0)) { cout << "\033[2J"; FY = fopen("help.txt", "r"); while ((fgets (szBuffer3, 1000, FY))!= 0) { cout << szBuffer3; } nA = 0; } if (!nA) exit(1); cout << "\033[2J"; strcpy(Pfad, argv[1]); Linenumber(lLineNumber); if(argc == 2) { cout << "\n" << "Die Woerter aus folgenden Dateien wurden gefunden:\n\n"; FileSearch(Pfad, szBuffer3, lLineNumber); } remove(szIndexTemp); remove(szPfadTemp); cout << "\n"; } // main LineNumber.cpp #include "SabineIndex.h" void Linenumber(long &lLineNumber) { char Buffer[1000]={NULL}; FILE *Open; if((Open=fopen("c:\\Pfad.txt", "r"))!=NULL) { while(fgets(Buffer, 999, Open)!=0) { lLineNumber++; } } fclose(Open); } [/PHP] [PHP] GetWords.cpp #include "SabineIndex.h" void GetWords(char *b, long& lLineNumber) { int nCharacter, nA, nPosition = 0, nI; char szAusgelesenes[1000]={NULL}; bool fFound=false; FILE *Uebergabedatei; WritePath(b, lLineNumber, fFound); nA = 0; Uebergabedatei = fopen(b, "r"); nCharacter = fgetc (Uebergabedatei); while (nCharacter != EOF) { if(nCharacter != -1) { if ((nCharacter<'A'||nCharacter>'z')||(nCharacter>'Z'&&nCharacter<'a')) { szAusgelesenes[nPosition] = '\0'; _strlwr(szAusgelesenes); if(strlen(szAusgelesenes)>1) { if(fFound==false) Ueberpruefung(szAusgelesenes, lLineNumber); } // if nPosition = 0; for(nI=0; nI<50; nI++) szAusgelesenes[nI] = NULL; } // if else { szAusgelesenes[nPosition] = nCharacter; nPosition++; } // else } // if nCharacter = fgetc (Uebergabedatei); } // while if(fFound==false) lLineNumber++; fclose(Uebergabedatei); } // Auslesen Ueberpruefung.cpp #include "SabineIndex.h" #define Tab '\t' char gszIndex[]={"c:\\Index.txt"}; void Ueberpruefung(char *pszWort, long lDateinummer) { // Name der Indexdatei ist global Konstante FILE *Index, *IndexTemp; char szWort[1000]={NULL}, szBuffer[1000]={NULL}, szIndexTemp[]={"c:\\IndexTemp.txt"}, szToken[]="\t", *Token, *Token2, szBufferCopy[500]={NULL}, szBufferCopy2[500]={NULL}; long lLength, lLength1, lNumber=0; bool fFound=false, fFound2=false, fFound3=false; strcpy(szWort, pszWort); Index=fopen(gszIndex, "r"); IndexTemp=fopen(szIndexTemp, "a+"); // Wort wird in der Indexdatei gesucht // wenn pszWort in der Indexdatei vorhanden ist // dann ggf. lDateinummer in dieser Zeile anhängen // sonst pszWort + lDateinummer am Ende der Datei anhängen while(fgets(szBuffer, 1000, Index)!=0) { strcpy(szBufferCopy2, szBuffer); Token2 = strtok(szBufferCopy2, szToken); while(Token2!=NULL) { if(strcmp(Token2, pszWort)==0) fFound3=true; Token2 = strtok(NULL, szToken); } if(fFound3==true) { strcpy(szBufferCopy, szBuffer); Token = strtok(szBufferCopy, szToken); while(Token!=NULL) { lNumber = atoi(Token); if(lNumber==lDateinummer) fFound2=true; Token = strtok(NULL, szToken); } fFound=true; if(fFound2!=true) { lLength = strlen(szBuffer)-1; if(szBuffer[lLength]=='\n') { szBuffer[lLength]=Tab; } if(szBuffer[lLength]==0) { szBuffer[lLength+1]=Tab; } fwrite(szBuffer, sizeof(char), strlen(szBuffer), IndexTemp); fprintf(IndexTemp, "%d", lDateinummer); fwrite("\n", sizeof(char), strlen("\n"), IndexTemp); } if(fFound2==true) fwrite(szBuffer, sizeof(char), strlen(szBuffer), IndexTemp); } // if(strstr(szBuffer, pszWort)!=0) else { fwrite(szBuffer, sizeof(char), strlen(szBuffer), IndexTemp); } // else fFound3=false; } // while(fgets(szBuffer, 1000, Index)!=0) if(fFound==false) { lLength1=strlen(szWort); szWort[lLength1]=Tab; szWort[lLength1+1]='\0'; fwrite(szWort, sizeof(char), strlen(szWort), IndexTemp); fprintf(IndexTemp, "%d", lDateinummer); fwrite("\n", sizeof(char), strlen("\n"), IndexTemp); } // if fclose(Index); fclose(IndexTemp); remove(gszIndex); rename(szIndexTemp, gszIndex); } // void PruefeWort [/PHP] [PHP] WritePath.cpp #include "SabineIndex.h" char gszPfad[]={"c:\\Pfad.txt"}; void WritePath(char *b, long &lLineNumber, bool &fFound) { int nCharacter, nPosition; bool fFound2=false; char szBuffer[1000]={NULL}, szPfadTemp[]={"c:\\PfadTemp.txt"}, szBuffer2[1000]={NULL}; FILE *Pfad, *PfadTemp; PfadTemp = fopen(szPfadTemp, "a+"); Pfad = fopen(gszPfad, "r"); fFound2=false; nPosition = 0; nCharacter = 2; while(nCharacter != EOF) // Dateiname mit Pfad wird aus der Datei ausgelesen um zu schaun ob die Datei bereits einmal vorkam { fFound2 = false; nCharacter = fgetc(Pfad); if(nCharacter!=-1) { if (nCharacter == 10) { if(strlen(szBuffer)>1) { szBuffer[nPosition] = '\0'; _strlwr(szBuffer); _strlwr(; nPosition = 0; } // if if(strstr(b, szBuffer)!=0) // kam die Datei schon mal vor fFound2 = true -> der Dateiname und Pfad wird nicht { // erneut in die Datei geschrieben fFound2 = true; fFound = true; } if(strstr(b, szBuffer)==0) { fwrite(szBuffer, sizeof(char), strlen(szBuffer), PfadTemp); fwrite("\n", sizeof(char), strlen("\n"), PfadTemp); } } // if else { szBuffer[nPosition] = nCharacter; nPosition++; } // else } // if } // while if(fFound2==false) { fwrite(b, sizeof(char), strlen(, PfadTemp); // Dateiname wird mit Pfa in die Datei geschrieben, fwrite("\n", sizeof(char), strlen("\n"), PfadTemp); // danach ein Zeilenumbruch gemacht } fclose(PfadTemp); fclose(Pfad); remove(gszPfad); rename(szPfadTemp, gszPfad); } So, sagt jetzt bitte nicht das es zu wenig kommentiert ist, das weiß ich, ich hatte nur keine Zeit mehr das jetzt noch nachzukommentieren (hatte es schon mal kommentiert, habe dann was verändert und es da nicht mehr gemacht, sorry!) Das Programm läuft, nur mit diesem Fehler. Ich hoffe es kann mir wer was dazu sagen. Ach so, ich erstelle meine Programme mit Visual C++ 6.0 (ist glaube ich für die includes wichtig). Danke Euch das Ihr Euch die Mühe macht es schon mal durchzusehen (weil es schon was mehr ist). Bine Zitieren
Klotzkopp Geschrieben 27. Februar 2002 Geschrieben 27. Februar 2002 Das kann ich gar nicht kompilieren: An zwei Stellen (z.B. szAusgelesenes[nPosition] = '' Fehler: Leere Character-Konstante. Und die Funktion Ueberpruefung deklarierst Du mit drei Parametern, implementierst Sie aber mit zweien (und rufst sie auch mit zweien auf) Der Name der .h-Datei stimmt nicht mit den #includes überein (Tippfehler?) Und so was: char szIndex[]={"c:\Index.txt"} kann eigentlich nicht wirklich funktionieren, weil der Compiler \I als unbekannte Escape-Sequenz moniert. Wenn Du einen Backslash in einem String-Literal brauchst, dann must Du einen doppelten Backslash angeben: char szIndex[]={"c:\\Index.txt"} Zitieren
Woodstock Geschrieben 27. Februar 2002 Autor Geschrieben 27. Februar 2002 Sorry, da habe ich wohl nach dem letzten laufen lassen noch was verändern wollen und sollte dann aber wohl erst einmal weiterlernen. Also, wenn Du in der SabineIndex.h (ja, es war ein Schreibfehler) die beiden Parameter aus der Deklaration rausnimmst (beides mal 'int& k'), dann läuft es bei mir. Ich habe an dieser Stelle wo Du das szAusgelesenes[nPosition] = ' '; hast die Zeile szAusgelesenes[nPosition] = '\0';! Keine Ahnung warum er dass nicht mitkopiert hat. Und in meinem Quellcode ist auch das char szIndex[]={"c:\Index.txt"} nicht so, sondern wie Du schreibst mit char szIndex[]={"c:\\Index.txt"}. Genau so dann auch bei den anderen. Und dann läuft es auch. Bine PS: Ich glaube er macht das durch das Zitieren
gajUli Geschrieben 27. Februar 2002 Geschrieben 27. Februar 2002 Und weiter gehts: Du benutzt fwrite, oeffnest aber die Dateien nicht im Binary-Modus. Verdaechtig kommt mir auch das "a+" vor. Ich koennte mir gut vorstellen, dass Du bei mehrmaligen Aufrufen das Gleiche immer wieder an ein Dateiende anhaengst, kann das aber mangels Compilierbarkeit nicht verifizieren. Ich finde den Code auch zu schwierig nachzuvollziehen, um aus dem Listing sagen zu koennen, warum sich das Programm so verhaelt, weil Dateinamen an mehreren Stellen teilweise lokal an Variablen uebergeben werden, die dann ihrerseits an fopens gehen und dann gibts da auch noch renames. Zitieren
Crush Geschrieben 27. Februar 2002 Geschrieben 27. Februar 2002 Mit was für einen Editor arbeitest Du? UltraEdit oder sowas? Ich finde die farbliche Abgrenzung ganz interessant. Zitieren
Woodstock Geschrieben 27. Februar 2002 Autor Geschrieben 27. Februar 2002 Hmm, also muss ich den ganzen Code kommentieren, ja? Dann mache ich das heute abend bei mir zu Hause. Wenn Du aber die Änderungen vorminnst (z.B. aus dem 'c:\index.txt' wieder ein 'c:\\index.txt' machst (so wie es vor der benutzung von den Dingern war, und die beiden 'int& k' aus der Parameterliste in der Header Datei nimmst müsste es aber compilierbar sein. Zumindest klappt es bei mir. Und ich habe Euch alle Quelltexte des Programms gepostet. Bine Zitieren
Woodstock Geschrieben 27. Februar 2002 Autor Geschrieben 27. Februar 2002 Die farben kommen hier auf dem Board zustande wenn ich meinen Quelltext in ]PHP[]/PHP[ einfüger (Klammern sind jetzt falsch rum). Bei mir in der Programmierumgebung ist der ganz normal schwarz. Bine Zitieren
Poldi Geschrieben 27. Februar 2002 Geschrieben 27. Februar 2002 macht der das immer drei mal? egal wie viele unterordner etc pp? oder wechselt die anzahl? Zitieren
Woodstock Geschrieben 27. Februar 2002 Autor Geschrieben 27. Februar 2002 Er macht es genau drei Mal (dann stürtzt das Programm ab, weil die Textdatei dann schon so 150MB groß ist). Kann also sein das es sogar noch öfter auftritt. Wenn ich bloß einen Ordner nehme (der kann so viele Unterordner haben wie er will) dann geht es problemlos. Bine Zitieren
Poldi Geschrieben 28. Februar 2002 Geschrieben 28. Februar 2002 liste mal bitte die funktion file search ... ! ich kann die oben nicht finden! was übergibst du denn wenn du die ganze platte durchsuchen willst? ich mein den string. "c:" oder "c:\\" oder was. Zitieren
Woodstock Geschrieben 28. Februar 2002 Autor Geschrieben 28. Februar 2002 Ja, ich übergebe 'c:\' (entwerder als Parameter über die command line oder in den Settings. Hier die file serach: #include "SabineIndex.h" void FileSearch(const char* pszPfad1, char *szBuffer3, long& lLineNumber) { struct _finddata_t file; long hFile; char Pfad1[200], PfadSub[200]; char a[10]; strcpy(Pfad1, pszPfad1); strcpy(PfadSub, Pfad1); strcat(PfadSub, "*.*"); if(((hFile = _findfirst(PfadSub, &file))==-1L)) { cout << "No files in directory!\n"; } else { if(file.attrib&(_A_SUBDIR)) { if(((_stricmp(file.name, "."))==0)||((_stricmp(file.name, ".."))==0)) { strcpy(a, "Schade"); } else { strcat(Pfad1, file.name); strcat(Pfad1, "\\"); FileSearch(Pfad1, szBuffer3, lLineNumber); strcpy(Pfad1, pszPfad1); } } while( _findnext( hFile, &file ) == 0 ) { if(file.attrib&(_A_SUBDIR)) { if(((_stricmp(file.name, ".."))==0)||((_stricmp(file.name, "."))==0)) { strcpy(a, "Schade"); } else { strcat(Pfad1, file.name); strcat(Pfad1, "\\"); FileSearch(Pfad1, szBuffer3, lLineNumber); strcpy(Pfad1, pszPfad1); } } if((strstr(file.name, ".txt"))&&(_stricmp(file.name, "Index.txt")!=0)&&(_stricmp(file.name, "Pfad.txt")!=0)&&(_stricmp(file.name, "IndexTemp.txt")!=0)&&(_stricmp(file.name, "PfadTemp.txt")!=0)) { strcat(Pfad1, file.name); cout << Pfad1 << "\n"; GetWords(Pfad1, lLineNumber); } strcpy(Pfad1, pszPfad1); } // while } _findclose( hFile ); } [/PHP] BIne Zitieren
Woodstock Geschrieben 28. Februar 2002 Autor Geschrieben 28. Februar 2002 Hmm, habe ich die wirklich nicht gepostet? Sorry.... *duck* Bine Zitieren
Poldi Geschrieben 28. Februar 2002 Geschrieben 28. Februar 2002 if(file.attrib&(_A_SUBDIR)) { if(((_stricmp(file.name, ".."))==0)||((_stricmp(file.name, "."))==0)) { strcpy(a, "Schade"); } else { strcat(Pfad1, file.name); // ----- guck mal da ---- strcat(Pfad1, ""); FileSearch(Pfad1, szBuffer3, lLineNumber); strcpy(Pfad1, pszPfad1); } } [/PHP] kann das sein daß du da noch n "\" oder ein Leerzeichen anhängen mußt? momentan hängst du an der stelle nix an, das macht in meinen augen keinen sinn ... Zitieren
Poldi Geschrieben 28. Februar 2002 Geschrieben 28. Februar 2002 PS: gewöhn dir kommentare an, dann kann man dir auch besser helfen und du selbst findest fehler auch schneller. mach dir eventuell mal n struktogramm von den wichtigsten funktionen deines programmes, das hilf manchmal unglaublich weiter, weil man so besser nachvollziehen kann, was man da eigentlich tut. Zitieren
Woodstock Geschrieben 28. Februar 2002 Autor Geschrieben 28. Februar 2002 Do, ich hänge da was an. Das PHP hier ist bescheiden. Also, die File Search noch mal ohne PHP Darstellung: #include "SabineIndex.h" void FileSearch(const char* pszPfad1, char *szBuffer3, long& lLineNumber) { struct _finddata_t file; long hFile; char Pfad1[200], PfadSub[200]; char a[10]; strcpy(Pfad1, pszPfad1); strcpy(PfadSub, Pfad1); strcat(PfadSub, "*.*"); if(((hFile = _findfirst(PfadSub, &file))==-1L)) { cout << "No files in directory!\n"; } else { if(file.attrib&(_A_SUBDIR)) { if(((_stricmp(file.name, "."))==0)||((_stricmp(file.name, ".."))==0)) { strcpy(a, "Schade"); } else { strcat(Pfad1, file.name); strcat(Pfad1, "\\"); FileSearch(Pfad1, szBuffer3, lLineNumber); strcpy(Pfad1, pszPfad1); } } while( _findnext( hFile, &file ) == 0 ) { if(file.attrib&(_A_SUBDIR)) { if(((_stricmp(file.name, ".."))==0)||((_stricmp(file.name, "."))==0)) { strcpy(a, "Schade"); } else { strcat(Pfad1, file.name); strcat(Pfad1, "\\"); FileSearch(Pfad1, szBuffer3, lLineNumber); strcpy(Pfad1, pszPfad1); } } if((strstr(file.name, ".txt"))&&(_stricmp(file.name, "Index.txt")!=0)&&(_stricmp(file.name, "Pfad.txt")!=0)&&(_stricmp(file.name, "IndexTemp.txt")!=0)&&(_stricmp(file.name, "PfadTemp.txt")!=0)) { strcat(Pfad1, file.name); cout << Pfad1 << "\n"; GetWords(Pfad1, lLineNumber); } strcpy(Pfad1, pszPfad1); } // while } _findclose( hFile ); } Bine Zitieren
Woodstock Geschrieben 28. Februar 2002 Autor Geschrieben 28. Februar 2002 Und das mit den Kommentaren weiß ich, sorry. Ich mache das zuhause gerade (habe schon angefnagen bin aber nicht fertig geworden). Bine Zitieren
Poldi Geschrieben 28. Februar 2002 Geschrieben 28. Februar 2002 funktioniert das denn jetzt oder wie? Zitieren
Woodstock Geschrieben 1. März 2002 Autor Geschrieben 1. März 2002 Nein, der Fehler ist immer noch da. Aber wenn man die Index Datei ändert das sie so #include <stdio.h> #include <iostream.h> #include <string.h> #include <io.h> #include <math.h> #include <stdlib.h> void FileSearch(const char* pszPfad1, char *szBuffer3, long& lLineNumber); void GetWords(char *b, long& lLineNumber); void Ueberpruefung(char *pszWort, long lDateinummer); void WritePath(char *b, long &lLineNumber, bool &fFound); void Linenumber(long &lLineNumber); aussieht, dann läßt sich das Programm compilieren und auch starten. Bine Zitieren
Crush Geschrieben 1. März 2002 Geschrieben 1. März 2002 Also erstmal: Die Pfad-Slashs müssen immer doppelt sein, sonst frißt die kein Compiler: "c:\\IndexTemp.txt" cout << "33[2J"; das Ansi-Steuerzeichen würde ich lieber in Hex angeben, weil das außerhalb der DOS-Ausgabe nicht richtig ausgegeben werden würde. void WritePath(char *b, long &lLineNumber, bool &fFound) Ob alles klappt würde ich nicht "call by Referenz" übergeben, sondern zur Eindeutigkeit als bool direkt zurückgeben - ist einleuchtender. if(file.attrib&(_A_SUBDIR)) -> frißt der Compiler daß? Mach mal einen direkten == um zu schauen ob hier nicht ein Fehler vorliegt, weil mir das & etwas verdächtig vorkommt. strcat(Pfad1, ""); was soll das bezwecken? Zitat von Uli: "Ich finde den Code auch zu schwierig nachzuvollziehen, um aus dem Listing sagen zu koennen, warum sich das Programm so verhaelt, weil Dateinamen an mehreren Stellen teilweise lokal an Variablen uebergeben werden, die dann ihrerseits an fopens gehen und dann gibts da auch noch renames." -> Ist tatsächlich etwas verwirrend - eine strukturiertere Programmierung würde alles übersichlicher machen. Vielleicht noch ein paar Stellen als sinnvolle Funktionen auslagern könnte helfen. Beispiel: char Pfad1[200], PfadSub[200]; heißt oben die Deklaration strcpy(Pfad1, pszPfad1); dann wird freudig hin und her kopiert cout << Pfad1 << "n"; dann ausgegeben strcpy(Pfad1, pszPfad1); und ein neuer Pfad rüberkopiert oder besser noch: char a[10]; Deklaration strcpy(a, "Schade"); was reinschreiben und danach wird es nie wieder verwendet (ist das zum Debuggen???) Schon bei Überprüfung und Writepath könnten gleiche Inhalte geschrieben werden. Da hilft nur ein ganz direkter Debug-Trace. Du mußt einfach wissen, ob die Inhalte ander selben Stelle geschrieben werden und die äußerte Schleife dabei im Auge halten, wenn ja, dann abchecken, wann diese wiederholt wird. Wenn nein, dann schauen, warum ähnliche Inhalte an unterschiedlichen Stellen geschrieben werden könnten. Du schreibst 3 mal und arbeitest mit mehreren fFounds, die auch 3 mal erscheinen, das solltest Du auch zur Sicherheit (nach dem Trace) unter die Lupe nhemen, weil hier ja ein Zusammenhang möglich wäre. Im Zwiefelsfall wäre es denkbar, daß das Schreiben der Inhalte irgendwo rekursiv erfolgt (ist mir nicht aufgefallen, aber wäre möglich), doch dann wundert es mich, warum der nach der 3. Ebene abbrechen sollte. Ich würde mal testweise einen Aufrufzähler oben einbringen, der unten wieder runtergezählt wird, dann noch ein Vergleich als Abbruchkriterium, dann sieht man ob Rekursionen vorliegen. Es ist tatsächlich alles etwas Mysteriös und zu undurchsichtig, als daß man hier so einfach durchsteigen könnte. Zitieren
Woodstock Geschrieben 1. März 2002 Autor Geschrieben 1. März 2002 Ich schreibe nicht 'c:\index.txt' in das Array, sondern 'c:\\index.txt'! Das da nicht die zwei \\ stehen kam davon das ich das mit PHP hier hab darstellen lassen. Auch das 'strcat(Pfad1, ""); ', sondern 'strcat(Pfad1, "\\");'. Auch hier stehen die \\ wieder nicht wegen des PHP. char a[10]; Deklaration strcpy(a, "Schade"); was reinschreiben und danach wird es nie wieder verwendet (ist das zum Debuggen???) Ja, das war zum debuggen gedacht. Mehr auslagen soll ich nicht.if(file.attrib&(_A_SUBDIR)) -> frißt der Compiler daß? Mach mal einen direkten == um zu schauen ob hier nicht ein Fehler vorliegt, weil mir das & etwas verdächtig vorkommt. Ja, das tut er wohl, denn wenn ich einfach nur die Dateien mit Pfadangaben in die Pfad.txt schreiben lassen (also das schreiben der Wörter und Zahlen in die Index.txt auskommentiere), dann läuft das Programm ohne ein Problem durch.cout << "33[2J"; das Ansi-Steuerzeichen würde ich lieber in Hex angeben, weil das außerhalb der DOS-Ausgabe nicht richtig ausgegeben werden würde. Ich arbeite nur mit der Command Line als Ausgabemedium. Ich kann noch lange keine Fenster oder etwas anderes programmieren oder benutzen. Soweit bin ich einfach noch nicht. Werde ich nach dieser Lerneinheit (klassen usw.) dann sicher machen sollen, aber bis dahin soll es ganz normal über die Command Line laufen. void WritePath(char *b, long &lLineNumber, bool &fFound) In dieser Funktion klappt alles wunderbar. Ich bekomme in meiner Pfad.txt immer bloß eine Pfadangabe pro Zeile, und auch jede Datei mit Pfadangabe bloß einmal. Da ist keine doppelt.Schon bei Überprüfung und Writepath könnten gleiche Inhalte geschrieben werden. Sorry, aber das verstehe ich nicht. Ich übergebe nicht die gleichen Sachen (bis auf die Zeilennummer, die ich aber ja auch in beiden brauche), und ich arbeite auch nicht mit den gleichen Dateien. Einmal ist es die Index.txt in die ich etwas reinschreibe (bei Überprüfung), und dann die Pfad.txt (bei WritePath).Im Zwiefelsfall wäre es denkbar, daß das Schreiben der Inhalte irgendwo rekursiv erfolgt (ist mir nicht aufgefallen, aber wäre möglich), doch dann wundert es mich, warum der nach der 3. Ebene abbrechen sollte. Ich würde mal testweise einen Aufrufzähler oben einbringen, der unten wieder runtergezählt wird, dann noch ein Vergleich als Abbruchkriterium, dann sieht man ob Rekursionen vorliegen. Kannst Du mir da genau erklären wie ich das machen soll. Verstehe ich nicht ganz, würde ich aber gerne ausprobieren wenn Du sagst es wäre möglich. Bine Zitieren
Woodstock Geschrieben 1. März 2002 Autor Geschrieben 1. März 2002 Hier noch mal alles ohne die Benutzung von ]PHP[...]/PHP[ ([] sind hier extra falsch herum). Sabineindex.h #include <stdio.h> #include <iostream.h> #include <string.h> #include <io.h> #include <math.h> #include <stdlib.h> void FileSearch(const char* pszPfad1, char *szBuffer3, long& lLineNumber); void GetWords(char *b, long& lLineNumber); void Ueberpruefung(char *pszWort, long lDateinummer); void WritePath(char *b, long &lLineNumber, bool &fFound); void Linenumber(long &lLineNumber); Index.cpp #include "SabineIndex.h" void main(int argc, char *argv[], char *envp[]) { FILE *FY; char szBuffer3[1001]={NULL}; char szIndex[]={"c:\\Index.txt"}, szIndexTemp[]={"c:\\IndexTemp.txt"}, szPfad[]={"c:\\Pfad.txt"}, szPfadTemp[]={"c:\\PfadTemp.txt"}; int nA = 1; long lLineNumber=1; char Pfad[500]={NULL}; cout << argc << "\n"; if (argc == 1) { cout << "\033[2J"; cout << "\n\n"; cout << "Dieses Programm erstellt eine Datei welche alle Woerter die in Dateien auf Ihrer Festplatte\n" "vorhanden sind enthaelt. Zusaetzlich werden die Dateien in denen die Woerter vorkommen mit\n" "angegeben\n"; cout << "Brauchen Sie Hilfe zur Benutzung des Programms, rufen Sie das Programm mit dem\n" "Parameter '/?' oder '/h' auf!\n\n\n"; nA = 0; } if (!nA) exit(1); if ((strcmp(argv[1], "/?") == 0) || (strcmp(argv[1], "/h") == 0)) { cout << "\033[2J"; FY = fopen("help.txt", "r"); while ((fgets (szBuffer3, 1000, FY))!= 0) { cout << szBuffer3; } nA = 0; } if (!nA) exit(1); cout << "\033[2J"; strcpy(Pfad, argv[1]); Linenumber(lLineNumber); if(argc == 2) { cout << "\n" << "Die Woerter aus folgenden Dateien wurden gefunden:\n\n"; FileSearch(Pfad, szBuffer3, lLineNumber); } remove(szIndexTemp); remove(szPfadTemp); cout << "\n"; } // main Filesearch.cpp #include "SabineIndex.h" void FileSearch(const char* pszPfad1, char *szBuffer3, long& lLineNumber) { struct _finddata_t file; long hFile; char Pfad1[200], PfadSub[200]; char a[10]; strcpy(Pfad1, pszPfad1); strcpy(PfadSub, Pfad1); strcat(PfadSub, "*.*"); if(((hFile = _findfirst(PfadSub, &file))==-1L)) { cout << "No files in directory!\n"; } else { if(file.attrib&(_A_SUBDIR)) { if(((_stricmp(file.name, "."))==0)||((_stricmp(file.name, ".."))==0)) { strcpy(a, "Schade"); } else { strcat(Pfad1, file.name); strcat(Pfad1, "\\"); FileSearch(Pfad1, szBuffer3, lLineNumber); strcpy(Pfad1, pszPfad1); } } while( _findnext( hFile, &file ) == 0 ) { if(file.attrib&(_A_SUBDIR)) { if(((_stricmp(file.name, ".."))==0)||((_stricmp(file.name, "."))==0)) { strcpy(a, "Schade"); } else { strcat(Pfad1, file.name); strcat(Pfad1, "\\"); FileSearch(Pfad1, szBuffer3, lLineNumber); strcpy(Pfad1, pszPfad1); } } if((strstr(file.name, ".txt"))&&(_stricmp(file.name, "Index.txt")!=0)&&(_stricmp(file.name, "Pfad.txt")!=0)&&(_stricmp(file.name, "IndexTemp.txt")!=0)&&(_stricmp(file.name, "PfadTemp.txt")!=0)) { strcat(Pfad1, file.name); cout << Pfad1 << "\n"; GetWords(Pfad1, lLineNumber); } strcpy(Pfad1, pszPfad1); } // while } _findclose( hFile ); } GetWords #include "SabineIndex.h" void GetWords(char *b, long& lLineNumber) { int nCharacter, nA, nPosition = 0, nI; char szAusgelesenes[1000]={NULL}; bool fFound=false; FILE *Uebergabedatei; WritePath(b, lLineNumber, fFound); nA = 0; Uebergabedatei = fopen(b, "r"); nCharacter = fgetc (Uebergabedatei); while (nCharacter != EOF) { if(nCharacter != -1) { if ((nCharacter<'A'||nCharacter>'z')||(nCharacter>'Z'&&nCharacter<'a')) { szAusgelesenes[nPosition] = '\0'; _strlwr(szAusgelesenes); if(strlen(szAusgelesenes)>1) { if(fFound==false) Ueberpruefung(szAusgelesenes, lLineNumber); } // if nPosition = 0; for(nI=0; nI<50; nI++) szAusgelesenes[nI] = NULL; } // if else { szAusgelesenes[nPosition] = nCharacter; nPosition++; } // else } // if nCharacter = fgetc (Uebergabedatei); } // while if(fFound==false) lLineNumber++; fclose(Uebergabedatei); } // Auslesen Ueberpruefung.cpp #include "SabineIndex.h" #define Tab '\t' char gszIndex[]={"c:\\Index.txt"}; void Ueberpruefung(char *pszWort, long lDateinummer) { // Name der Indexdatei ist global Konstante FILE *Index, *IndexTemp; char szWort[1000]={NULL}, szBuffer[1000]={NULL}, szIndexTemp[]={"c:\\IndexTemp.txt"}, szToken[]="\t", *Token, *Token2, szBufferCopy[500]={NULL}, szBufferCopy2[500]={NULL}; long lLength, lLength1, lNumber=0; bool fFound=false, fFound2=false, fFound3=false; strcpy(szWort, pszWort); Index=fopen(gszIndex, "r"); IndexTemp=fopen(szIndexTemp, "a+"); // Wort wird in der Indexdatei gesucht // wenn pszWort in der Indexdatei vorhanden ist // dann ggf. lDateinummer in dieser Zeile anhängen // sonst pszWort + lDateinummer am Ende der Datei anhängen while(fgets(szBuffer, 1000, Index)!=0) { strcpy(szBufferCopy2, szBuffer); Token2 = strtok(szBufferCopy2, szToken); while(Token2!=NULL) { if(strcmp(Token2, pszWort)==0) fFound3=true; Token2 = strtok(NULL, szToken); } if(fFound3==true) { strcpy(szBufferCopy, szBuffer); Token = strtok(szBufferCopy, szToken); while(Token!=NULL) { lNumber = atoi(Token); if(lNumber==lDateinummer) fFound2=true; Token = strtok(NULL, szToken); } fFound=true; if(fFound2!=true) { lLength = strlen(szBuffer)-1; if(szBuffer[lLength]=='\n') { szBuffer[lLength]=Tab; } if(szBuffer[lLength]==0) { szBuffer[lLength+1]=Tab; } fwrite(szBuffer, sizeof(char), strlen(szBuffer), IndexTemp); fprintf(IndexTemp, "%d", lDateinummer); fwrite("\n", sizeof(char), strlen("\n"), IndexTemp); } if(fFound2==true) fwrite(szBuffer, sizeof(char), strlen(szBuffer), IndexTemp); } // if(strstr(szBuffer, pszWort)!=0) else { fwrite(szBuffer, sizeof(char), strlen(szBuffer), IndexTemp); } // else fFound3=false; } // while(fgets(szBuffer, 1000, Index)!=0) if(fFound==false) { lLength1=strlen(szWort); szWort[lLength1]=Tab; szWort[lLength1+1]='\0'; fwrite(szWort, sizeof(char), strlen(szWort), IndexTemp); fprintf(IndexTemp, "%d", lDateinummer); fwrite("\n", sizeof(char), strlen("\n"), IndexTemp); } // if fclose(Index); fclose(IndexTemp); remove(gszIndex); rename(szIndexTemp, gszIndex); } // void PruefeWort WritePath.cpp #include "SabineIndex.h" char gszPfad[]={"c:\\Pfad.txt"}; void WritePath(char *b, long &lLineNumber, bool &fFound) { int nCharacter, nPosition; bool fFound2=false; char szBuffer[1000]={NULL}, szPfadTemp[]={"c:\\PfadTemp.txt"}, szBuffer2[1000]={NULL}; FILE *Pfad, *PfadTemp; PfadTemp = fopen(szPfadTemp, "a+"); Pfad = fopen(gszPfad, "r"); fFound2=false; nPosition = 0; nCharacter = 2; while(nCharacter != EOF) // Dateiname mit Pfad wird aus der Datei ausgelesen um zu schaun ob die Datei bereits einmal vorkam { fFound2 = false; nCharacter = fgetc(Pfad); if(nCharacter!=-1) { if (nCharacter == 10) { if(strlen(szBuffer)>1) { szBuffer[nPosition] = '\0'; _strlwr(szBuffer); _strlwr(; nPosition = 0; } // if if(strstr(b, szBuffer)!=0) // kam die Datei schon mal vor fFound2 = true -> der Dateiname und Pfad wird nicht { // erneut in die Datei geschrieben fFound2 = true; fFound = true; } if(strstr(b, szBuffer)==0) { fwrite(szBuffer, sizeof(char), strlen(szBuffer), PfadTemp); fwrite("\n", sizeof(char), strlen("\n"), PfadTemp); } } // if else { szBuffer[nPosition] = nCharacter; nPosition++; } // else } // if } // while if(fFound2==false) { fwrite(b, sizeof(char), strlen(, PfadTemp); // Dateiname wird mit Pfa in die Datei geschrieben, fwrite("\n", sizeof(char), strlen("\n"), PfadTemp); // danach ein Zeilenumbruch gemacht } fclose(PfadTemp); fclose(Pfad); remove(gszPfad); rename(szPfadTemp, gszPfad); } Linenumber.cpp #include "SabineIndex.h" void Linenumber(long &lLineNumber) { char Buffer[1000]={NULL}; FILE *Open; if((Open=fopen("c:\\Pfad.txt", "r"))!=NULL) { while(fgets(Buffer, 999, Open)!=0) { lLineNumber++; } } fclose(Open); } Bine Zitieren
Poldi Geschrieben 1. März 2002 Geschrieben 1. März 2002 hast du keinen debugger? wenn du mit borland arbeitest, kannst du haltepunkte setzen und das programm gaaaaaanz langsam durchlaufen lassen. so kannst du besser nachvollziehen, was dein teil überhaupt macht. durch ne markierung wird dir im quellcode angezeigt, wo das programm grade ist, wenn du die maus über ne variable hältst, wird dir der inhalt angezeigt. ich würd das gerne ausprobieren, aber dann müßte ich einiges ändern weil ich unter unix arbeite, da hab ich jetzt einfach nicht genung zeit für. Zitieren
Woodstock Geschrieben 1. März 2002 Autor Geschrieben 1. März 2002 Doch, ich habe einen Debugger. Das Problem ist nur, das zum Beispiel die Funktion Ueberpruefen so an die schätzungsweise 5000 - 10000 Mal durchlaufen wird (jenachdem wie viele Textdateien sich gerade auf der Pallte befinden). Ich habe mir mit dem Debugger schon angesehen welche Dateien er öffnet und damit arbeitet (und selnst das sind so 250 bis 500). Dafür alleine brauche ich dann schon so 1 1/2 Stunden bis 2 1/2 Stunden. Wenn ich das jetzt mit jedem Wort mache sitze ich da mindestens 10 Stunden dran. Und ich wüßte nicht was ich sonst noch überprüfen sollte. Weil ja das komische ist das wenn ich einen Ordner durchsuchen lasse (egal ob nun mit unterordnern oder nicht) es ja klappt. Es muss also mit der gesamten Platte zusammenhängen. Bine Zitieren
gajUli Geschrieben 1. März 2002 Geschrieben 1. März 2002 Es gibt auch noch andere Debugging-Methoden. Beispielsweise sich kritische Inhalte und Zustaende in eine zusaetzliche Datei schreiben. Zitieren
Woodstock Geschrieben 1. März 2002 Autor Geschrieben 1. März 2002 Wie meinst DU das? Kannst Du dazu mal ein parixisnahes Beispiel bringen? Bine Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.