Zum Inhalt springen

Esrtellen einer Index Datei - HILFE!


Empfohlene Beiträge

Geschrieben

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(B);
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(B), 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

Geschrieben

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"}

Geschrieben

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




			
		
Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

 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 ...

Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

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(B);

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(B), 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

Geschrieben

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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...