Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

....

}

Geschrieben

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ß!

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

}

Geschrieben

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.

Geschrieben

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

Geschrieben

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");

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