Woodstock Geschrieben 24. September 2001 Geschrieben 24. September 2001 Hallo, also ich habe da ein Problem. Ich bin noch nicht so weit mit C++, habe im August erst damit angefangen (in meiner Ausbildung zur FIAE). Jetzt soll ich ein Programm entwickeln, welches Dateien 'scannt' und mir sagt ob ein bestimmtes Wort (welches der User vorher eingeben können soll) entahlten ist. Soweit so gut, alles verstanden, nur wie umsetzten? Mein Chef meint ich solldie Datei mit einem Befehl der 'fopen' heißt in mein Programm einschließen bzw. die Datei öffnen. Kann mir jemand sagen wie ich damit umzugehen habe, weil in der Library finde ich dazu nichts weiter... Danke Bine Zitieren
Dagegen Geschrieben 24. September 2001 Geschrieben 24. September 2001 Hi Bine, probier mal damit: FILE *fp #initialisiert einen Pointer der in das File zeigt char buffer[MAXSIZE]={NULL} #initialisert ein char Array mit der groesse MAXSIZE in dem der Inhalt des Files Zeilenweise gespeichert wird fp = fopen(FileName,"r") # oeffnet das File; "r" heisst read only while(1) { if(fgets(buffer,MAXSIZE,fp) == NULL) break; #mit fgets liest du immer eine Zeile aus dem File in buffer; diesen kannst du dan auf deinen suchbe griff untersuchen. MAXSIZE gibt an wieviel Zeilen fgets maximal lesen soll; falls vor erreichen von Maxsize ein String-Enede zeichen kommen sollte liest er nur bis dahin; Ist das File abgearbeitet liefert fgets einen NULL- Pointer zurueck; .... deine Suchroutine .... } Zitieren
Crush Geschrieben 24. September 2001 Geschrieben 24. September 2001 Also wegen dem "Scan"-Algorhythmus, da habe ich ein paar verschiedene kleine Sources zu. Such Dir was möglichst Undurchschaubares raus und versuche damit alle rückwärts aus dem Sessel zu hauen, weil ein Normaler wohl kaum auf solch irre Lösungsmöglichkeiten kommen würde! Am besten Implementiere alle Suchalgorhythmen und lasse dem Anwender die Auswahl dazu! Source1: ************************************************** /* Brute-Force-Algorithmus */ /* * In Puffer finden wir den Text, in Pattern das Suchmuster. * Die Länge des Texts entnehmen wir der Variablen size. */ long Brute_Search(char *Puffer,char *Pattern, long size) { long i,j,M=strlen(Pattern),N=size; for( i=0,j=0; j<M && i<N; i++, j++ ) while( Puffer != Pattern[j] && i<N ) { i-=(j-1); j=0; } if( j==M ) { STFound++; return i-M; } else { return i; } } ************************************************** Source2+Source3 (gehören zusammen) ************************************************** /* Diese Routine richtet das erforderliche Sprung-Array * fürs Knuth-Morris-Pratt-Verfahren ein */ long NextArray[50]; /* Falls nötig, größer dimensionieren */ void InitNextArray(char *pattern) { long i,j, M=strlen(pattern); NextArray[0]=-1; for( i=0, j=-1; i<M; i++,j++,NextArray= (pattern==pattern[j])? NextArray[j]:j ) while( (j>=0) && (pattern != pattern[j] ) ) j=NextArray[j]; } ************************************************** Source3 ************************************************** /* Der Suchalgorithmus nach Knuth-Morris-Pratt * eignet sich hervorragend für die Suche in externen * Dateien */ extern long NextArray[]; long KMP_Search(char *Puffer,char *Pattern, long size) { long i,j,M=strlen(Pattern),N=size; for( i=0,j=0; j<M && i<N; i++, j++ ) while( (j>=0) && (Puffer != Pattern[j]) && i<N ) j=NextArray[j]; if( j==M ) { return i-M; } else { return i; } } ************************************************** Source4+Source5 gehören zusammen ************************************************** /* Das für die Vorgehensweise von Boyer-Moore benötigte * Skip-Array läßt sich so kreieren */ long Skip[256]; void InitSkip(unsigned char *pattern) { long i,j, M=strlen(pattern); for( i=0; i<256; Skip[i++]=M ); for( i=0,j=M-1; j>=0; j--,i++ ) if( Skip[pattern[j]] == M ) Skip[pattern[j]] = i ; } ************************************************** Source5 ************************************************** /* So einfach ist der extrem leistungsfähige * Boyer-Moore-Algorithmus zu implementieren */ extern long Skip[]; long BM_Search(unsigned char *Puffer, unsigned char *Pattern, long size) { long i,j,M=strlen(Pattern),N=size,t; for( i=M-1,j=M-1; j>=0; i--, j-- ) { while( Puffer != Pattern[j] ) { t=Skip[Puffer]; i+=(M-j>t)?M-j:t; if( i>=N ) return N; j=M-1; } M=strlen(Pattern); } return i; } ************************************************** Source6 frag nicht was d & q bedeuten sollen (häh?) ************************************************** /* Das Robin-Karp-Verfahren ermöglicht lineare Suchzeiten, * unabhängig von der Eingabe */ #define q 33554393 #define d 32 long RK_Search(unsigned char *Puffer, unsigned char *Pattern, long size) { long i,j,M=strlen(Pattern),N=size,dM=1,h1=0,h2=0; for( i=1; i<M ; i++ ) dM=(d*dM)%q; for( i=0; i<M ;i++ ) { h1 = (h1 << 5 + (long)Pattern) % q; h2 = (h2 << 5 + (long)Puffer) % q; } for( i=0; h1 != h2 ;i++ ) { h2 = (h2 + d*q - (long)Puffer * dM) % q; h2 = (h2<<5 + (long)Puffer[i+M]) % q; if( i > N-M ) return N; } return i; } ************************************************** Viel Spaß! Zitieren
Crush Geschrieben 24. September 2001 Geschrieben 24. September 2001 Zuviel geklickt <FONT COLOR="#a62a2a" SIZE="1">[ 24. September 2001 22:06: Beitrag 1 mal editiert, zuletzt von Crush ]</font> Zitieren
Crush Geschrieben 24. September 2001 Geschrieben 24. September 2001 Zuviel geklickt! <FONT COLOR="#a62a2a" SIZE="1">[ 24. September 2001 22:07: Beitrag 1 mal editiert, zuletzt von Crush ]</font> Zitieren
Woodstock Geschrieben 25. September 2001 Autor Geschrieben 25. September 2001 ok, ich danke Euch ersteinmal, wobei ich sagen muss, dass ich das Programm schon gerne noch selber schreiben würde, weil es halt mein Projekt ist, und ich nur so eine Hilfe brauchte (bin halt noch nicht so weit)! Danke aber trotzdem... Bine Zitieren
Hasi Geschrieben 25. September 2001 Geschrieben 25. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock: <STRONG> dass ich das Programm schon gerne noch selber schreiben würde, weil es halt mein Projekt ist, und ich nur so eine Hilfe brauchte (bin halt noch nicht so weit)! </STRONG> Zitieren
Poldi Geschrieben 25. September 2001 Geschrieben 25. September 2001 Hey Crush, glaubst du nicht, daß deine tollen kryptischen unkommentierten Suchteile nicht eventuell ein bischen herausfordernd sind für einen Anfänger? Bine, fang erst mal damit an, die Datei zeilenweise einzulesen. Danach kannst du dann die einzelnen Worte in der Zeile in einem String abspeichern und wieder ausgeben. Wenn du das hast bist du schon fast fertig. Am Anfang solltest du darauf achten, nicht zu viel auf einmal zu machen, sondern immer kleine Schritte vorwärts zu gehen. Sonst verlierst du leicht den Überblick. Viel Erfolg! Poldi, die sich vor gar nicht allzulanger Zeit auch noch mit so netten Aufgaben beschäftigen durfte ... aber jetzt wird sie von ihrem Chef gnadenlos ausgebeutelt ... *schnüff* ... als Programmiermaschine ... *schluchz* ... schnell, lauf weg solange du noch kannst ... Zitieren
Hasi Geschrieben 25. September 2001 Geschrieben 25. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Poldi: <STRONG> Danach kannst du dann die einzelnen Worte in der Zeile in einem String abspeichern und wieder ausgeben. Wenn du das hast bist du schon fast fertig.</STRONG> Zitieren
Woodstock Geschrieben 25. September 2001 Autor Geschrieben 25. September 2001 Ok, also ihr seid wirklich lieb! Bin auch schon etwas weiter, und mein Chef meint auch es wäre auch ganz ok wenn ich noch nicht alles auf einmal kann. Also, geöffnet bekomme ich meine Datei jetzt schon mal *freu*, jetzt muss ich halt die Zeilen oder Wörter auslesen und in Arrays speichern, denke ich, oder? Bin auch weiterhin für Eure Tips dankbar! Bine Zitieren
Dagegen Geschrieben 25. September 2001 Geschrieben 25. September 2001 Hi Woodstck, Hasi hat recht probiers mal so: if (strstr(buffer1,"Suchbegriff") printf ("Suchbegriff gefunden"); else printf ("Suchbegriff nicht gefunden") strstr vergleicht den Inhalt eines Puffers mit einem Pattern, wie du dein File Zeilenweise in den Puffer liest hab ich ja oben schon beschrieben. Statt "Suchbegriff" kannst du hier natuerlich auch eine Variabel als Pattern verwenden. Wird das Pattern in Puffer gefunden wird 1 als returnwert geliefert ansonsten null Zitieren
Woodstock Geschrieben 25. September 2001 Autor Geschrieben 25. September 2001 Hmm, noch eine Frage, achtet er beim Vergleichen auf Groß- und Kleinschreibung? Und wenn ja, kann ichdas irgendwie ausschalten? Bine Zitieren
Hasi Geschrieben 25. September 2001 Geschrieben 25. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock: <STRONG>Hmm, noch eine Frage, achtet er beim Vergleichen auf Groß- und Kleinschreibung? Und wenn ja, kann ichdas irgendwie ausschalten? Bine</STRONG> Zitieren
Woodstock Geschrieben 25. September 2001 Autor Geschrieben 25. September 2001 Ok, nenn mich jetzt total blöd, aber es klappt nicht. Ich habe versucht das mit dem zu suchenden Wort zu tun. Ungefähr so: void main() { FILE *fz; char buffer[20]={NULL}; char Eingabe; cout << "Bitte das gesuchte Wort eingeben: "; cin >> Eingabe; _strlwr(Eingabe); cout << Eingabe << "\n\n";/* } darauf hin sagt er mir das er nicht von char zu char* konvertieren kann: -> void main() { FILE *fz; char buffer[20]={NULL}; char Eingabe[20]; cout << "Bitte das gesuchte Wort eingeben: "; cin >> Eingabe; _strlwr(Eingabe); cout << Eingabe << "\n\n";/* } Jetzt compilt und linkt er, aber das Ergebnis ist trotzdem nicht das welches es sein sollte, denn ich wollte ja jetzt die umgewandelte Form meiner Eingabe ausgeben. Was mache ich falsch? (Wahrscheinlich bin ich einfach zu blöd dazu...) Bine Zitieren
Hasi Geschrieben 25. September 2001 Geschrieben 25. September 2001 #include "stdafx.h" #include "string.h" #include "iostream.h" void main() { char Eingabe[100]; cout << "Bitte das gesuchte Wort eingeben: "; cin >> Eingabe; cout << Eingabe << "\n\n"; //gibt deine eingabe vor der Konvertierung aus _strlwr(Eingabe); cout << Eingabe << "\n\n"; //gibt deine eingabe nach der Konvertierung aus } <FONT COLOR="#a62a2a" SIZE="1">[ 25. September 2001 12:25: Beitrag 1 mal editiert, zuletzt von Hasi ]</font> Zitieren
Woodstock Geschrieben 25. September 2001 Autor Geschrieben 25. September 2001 Hmm, ich glaube es liegt an einer der Header Dateien die ich nicht includet habe. Hab von der noch nichts gehört. versuche es mal eben... Bine Zitieren
Hasi Geschrieben 25. September 2001 Geschrieben 25. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock: <STRONG>Hmm, ich glaube es liegt an einer der Header Dateien die ich nicht includet habe. Hab von der noch nichts gehört. versuche es mal eben...</STRONG> Zitieren
Woodstock Geschrieben 25. September 2001 Autor Geschrieben 25. September 2001 Also ich arbeite mit dem Visual Studio 6.0! Wozu ist diese include Datei da? Weil ich brauche sie dafür jetzt wirklich nicht. Klappt nämlich, danke... Bine Zitieren
Hasi Geschrieben 25. September 2001 Geschrieben 25. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock: <STRONG>Also ich arbeite mit dem Visual Studio 6.0! Wozu ist diese include Datei da? Weil ich brauche sie dafür jetzt wirklich nicht. Klappt nämlich, danke...</STRONG> Zitieren
Woodstock Geschrieben 25. September 2001 Autor Geschrieben 25. September 2001 Tja, und noch ein Problem: Er liest in meinem Programm nur die erste Zeile der Datei die ich ihm gebe. Was ist in meinem Quelltext noch falsch?void main() { FILE *fz; char buffer[101]={NULL}; char Eingabe[101]; int i=0; cout << "Bitte das gesuchte Wort eingeben: "; cin >> Eingabe; // cout << Eingabe << "\n"; _strlwr(Eingabe); // cout << Eingabe << "\n\n"; fz = fopen ("c:\\personal\\E-Mail Liste.txt", "r"); if (fz == NULL) cout << "Fehler, Datei nicht gefunden!\n\n"; else fgets(buffer, 100, fz); if (strstr(buffer,"Eingabe")) { cout << "Suchbegriff gefunden"; cout << Eingabe << "\n\n"; } else cout << "Suchbegriff nicht gefunden\n\n"; } Zitieren
Hasi Geschrieben 25. September 2001 Geschrieben 25. September 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock: [QB]fgets(buffer, 100, fz); [QB] Zitieren
Poldi Geschrieben 25. September 2001 Geschrieben 25. September 2001 probiers mal so: while ( (fgets(buffer,100,fz) != 0) { ... } dann wiederholt er das zwischen den klammern für jede zeile in der input datei ein mal. oder schlag mal unter eof (end of file) nach. das geht so ähnlich. 100 zeichen pro zeile könnte was knapp werden. setz das lieber was höher, auf tausend oder so. Zitieren
Woodstock Geschrieben 26. September 2001 Autor Geschrieben 26. September 2001 Danke Euch, jetzt klappt es so wie es soll. Erste Stufe geschafft, jetzt kommt die nächste... Eventuell bis gleich. Bine Zitieren
Woodstock Geschrieben 26. September 2001 Autor Geschrieben 26. September 2001 Hey, hab noch eine Frage: Meine Quelldatei sieht jetzt so aus: void main() { FILE *fz; char buffer[1001]={NULL}; char Eingabe[101]; int i=0; fz = fopen ("c:\\personal\\EMailListe.txt", "r"); if (fz == NULL) cout << "Fehler, Datei nicht gefunden!\n\n"; else { cout << "Bitte das gesuchte Wort eingeben: "; cin >> Eingabe; _strlwr(Eingabe); do { fgets(buffer, 1000, fz); _strlwr(buffer); if(strstr (buffer, Eingabe)) { cout << "\nSuchbegriff gefunden!\n\n"; break; } } while ((fgets (buffer, 1000, fz))!= 0); } } Wie kann ich das jetzt noch machen das wenn der gesuchte Begriff nicht gefunden wurde, ich anzeigen lassen kann das der Suchbegriff nicht gefunden wurde? Müsste ich doch irgendwie machen können, nur in die 'do while - Schleife' kann ich das ja nicht mit reinbringen! Muss ich dazu die 'do while - Schleife' auch in eine Schleife setzten? Bine Zitieren
Dagegen Geschrieben 26. September 2001 Geschrieben 26. September 2001 Hi Woodstock, fueg halt noch ne Variable ein, die wenn der String gefunden wird den Wert 1 erhaelt uind wenn nicht dann den WErt 0. Nach ablauf der schleife pruefst du dann den Wert der Variable und gibts bei Wert=0 eine fehlermeldung aus. z. B: do { fgets(buffer, 1000, fz); _strlwr(buffer); if(strstr (buffer, Eingabe)) { cout << "\nSuchbegriff gefunden!\n\n"; Fehler=0; break; } else { Fehler=1; } } while ((fgets (buffer, 1000, fz))!= 0); If (Fehler==1) printf("Pattern in File nicht gefunden"); 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.