Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi,

also, ich habe folgendes Problem (es handelt sich natürlich immer noch um das eine Programm um das es schon die ganze Zeit geht) :( :

Ich lese aus einer Datei, soweit so gut.

Stößt er jetzt nicht auf einen Buchstaben, hängt er an das Gelesene ein Nullzeichen an, und fängt an das Wort zu untersuchen, nämlich ob es mit einem der Suchbegriffe übereinstimmt.

Sieht im Moment so aus:

while (k < scnt2-1)

{

if(strstr (Ausgelesenes, Eingabe[k]))

Gefunden = 1;

else

{

Gefunden = 0;

}

pos = 0;

if (Gefunden == 1)

cout << Eingabe[k] << " in Datei " << Datei[j] << " gefunden!\n";

}

k++;

}

Nun habe ich das Problem das ich nicht möchte, das wenn der gesuchte Begriff zwei Mal in der Datei vorkommt, das er mir das auch zweimal sagt, einmal reicht mir. Habe es dann so versucht:

while (k < scnt2-1)

{

if(strstr (Ausgelesenes, Eingabe[k]))

{

Gefunden = 1;

z++;

}

else

{

Gefunden = 0;

}

pos = 0;

if (z == 1)

{

if (Gefunden == 1)

cout << Eingabe[k] << " in Datei " << Datei[j] << " gefunden!\n";

}

k++;

}

Dabei habe ich das Problem, das er mir dann zwar bei ersten gesuchten Begriff es nur einmal anzeigt, wie ich es auch will :), kommt nur leider in der selben Datei auch noch ein zweiter oder sogar dritter der gesuchten Begriffe drin vor, so wird dies nicht mehr angezeigt.

Wie kann ich das ändern :confused: ?

Bine

Geschrieben

Ja, genau um 'z' geht es ja. Ich habe diese Variable in mein Programm eingefügt, weil ich über sie gerne regeln würde, das mir das Programm nur einmal ausgibt einen bestimmten Suchbegriff gefunden zu haben, auch wenn er ihn in ein und derseben Datei mehrmals gefunden hat.

Nehmen wir also an, ich untersuche die Datei 'a', auf die Suchbegriffe '1' + '2'. Wird '1' jetzt zwei Mal in der Datei gefunden, soll aber trotzdem nur einmal angegeben werden, das er '1' gefunden hat.

Soweit so gut, klappt nur nicht so. Das Problem welches ich habe ist, er gibt mir nur noch einmal an '1' gefunden zu haben, wenn jedoch auch '2' in der Datei 'a' vorkommt, so erfahre ich das nicht.

Mein Quelltext an einem Stück sieht so aus:

#include "Sabine(1).h"

FILE *fz, *fy;

char buffer2[1001]={NULL}, buffer3[1001]={NULL};

char Datei[100][1000], Liste[2][150], Eingabe[50][101];

char Ausgelesenes[128];

int Gefunden;

int j = 0, k = 0, c, b, d, i = 0, z = 0;

int scnt = 0, scnt2 = 0, pos = 0;

void main()

{

cout << "Mit diesem Programm können Sie eine "

"beliebige Datei auf einen Suchbegriff hin \nuntersuchen!"

" Wollen Sie keine weitere Datei mehr durchsuchen\nbitte "

"'---' eingeben!\n\n";

cout << "Bitte geben Sie die List-Datei mit Pfad an: ";

cin >> Liste[scnt];

fy = fopen (Liste[scnt], "r");

if (fy == NULL)

cout << "Feler - List-Datei nicht gefunden!\n";

else

{

do

{

cout << "Bitte das " << scnt2+1 << ". gesuchte Wort eingeben: ";

cin >> buffer2;

_strlwr(buffer2);

strcpy(Eingabe[scnt2], buffer2);

scnt2++;

} while (strcmp(buffer2, "---"));

while ((fgets (buffer3, 1000, fy))!= 0)

{

_strlwr(buffer3);

strcpy(Datei[scnt], buffer3);

b=0;

do

{

if (Datei[scnt] == '\n')

{

Datei[scnt] = '\0';

}

b++;

} while(Datei[scnt] != 0);

scnt++;

z=0;

Gefunden = 2;

fz = fopen (Datei[j], "r");

if (fz==NULL)

cout << "Fehler - Datei nicht gefunden!\n";

else

{

c = 2;

while (c != EOF)

{

c = fgetc (fz);

if ((c<'A'||c>'z')||(c>'Z'&&c<'a')||(c==EOF))

{

Ausgelesenes[pos] = '\0';

_strlwr(Ausgelesenes);

k = 0;

while (k < scnt2-1)

{

if(strstr (Ausgelesenes, Eingabe[k]))

{

Gefunden = 1;

z++;

}

else

{

Gefunden = 0;

}

pos = 0;

if (z == 1)

{

if (Gefunden == 1)

cout << Eingabe[k] << " in Datei " << Datei[j] << " gefunden!\n";

}

k++;

} // while

} // if

Ausgelesenes[pos] = c;

pos++;

} // while

} // else

j++;

} // while

} // else

fclose (fz);

fclose (fy);

} // main

Also, es geht mir darum das irgendwie zu regeln, das wenn er die Datei 'a' untersucht, er mir '1' + '2' als gefunden angibt, aber nur einmal, auch wenn einer der beiden mehrmals darin vorkommt. Und das irgendwie über die Variable 'z'!

Zu der Suchmaschine kannich nur soviel sagen, dass ich mir das nicht aussuchen kann. Es ist ein Projekt, was ich machen muss.

Bine

Geschrieben

Hallo Bine,

ich kann jetzt deinen Fehler noch nicht lokalisieren, hab mir deien Quelltext aber mal ausgedruckt, vielleicht sehe ich nachher im Zug noch etwas (habe hier auch noch ein bißchen Arbeit ;) ).

Was mir aber bis jetzt aufgefallen ist:

a)

die Bezeichner sprechen nicht alle für sich.

Wie wärs z.B. mit

int anzahl_vorkommen; // statt z

B)

Kommentare?

Helfen einem immer selber, zu wissen was man überhaupt tut, denn dann muß man sich, ums hinschreiben zu können, überlegen, was man tun will :)

c)

Überleg dir deinen Algorhytmus nochmal genau und schreib ihn dir in Worten auf. Das mache ich auch manchmal, es hilft wirklich. Ich denke, es gibt eine einfachere Lösung als deine bisherige. :rolleyes:

Oh, ich sehe gerade, daß du in der while-Schleife, in der du z auf ==1 abfragst, z nie auf 0 zurücksetzt, aber immer weiter erhöhst, z kann nur einmal 1 werden und damit gibt es auch nur beim ersten Suchwort eine Ausgabe...

Der Käptn

Geschrieben

Nun, das Problem ist halt, das solange es um ein und dasselbe Suchwort geht, 'z' ja auch nur einmal 1 werden soll. Nur wenn es um den nächten Suchbegriff geht, z wieder den Wert '1' annehmen soll.

Bine

PS: Danke aber schon mal!

Geschrieben

So wie Du es Dir vorstellst, geht es aber leider nicht.

Ich untersuche das Ausgelesene aus der Datei auf jedes Suchwort, und lese dann weiter aus der Datei aus.

Nehmen wir an, unsere gesuchten Begriffe wären 'bla', 'Hallo' und 'Danke'.

So, er öffnet nun die erste Datei, und fängt an, Wort für Wort auszulesen.

Jetzt stell Dir vor Er ließt das Wort 'bla' aus, untersucht es daraufhin hin ob es mit einem der Suchbegriffe übereinstimmt. Und wie schön, so ist es, also gibt er aus, dass er den Suchbegriff gefunden. Desweiteren liest er das irgendwann das Wort 'Hallo' aus, und sagt Dir nun wieder dass es mit einem der Suchbegriffe übereinstimmt. Liest er jetzt noch einmal das Wort 'bla' aus, so soll er es mir aber nicht nocheinmal angeben, das er es gefunden hat, denn für diese Datei weiß ich es ja schon.

So wie Du Dir das vorstellst, müßte ich ersteinmal alle Dateien nach einem Suchbegriff untersuchen, und dann wieder alle Dateien auf den nächsten.

Bine

Geschrieben

OK, ich muß gestehen daß ich am Wochenende *keine* Quelltexte studiert habe...

Aber folgenden Vorschlag habe ich für dich:

Du speicherst ja deine Suchbegriffe in einem Array von char-Arrays. Um festzuhalten, welche Begriffe gefunden werden, legst du ein weiteres Array von ganzen Zahlen an, das du durchgehend mit 0 initialisierst. Der Trick ist, daß die Indizes beider Arrays korrespondieren. Wenn du nun das Wort in

Eingabe[x]

findest, erhöhst du den Wert in

Gefunden[x]

Das Ergebnis gibst du dann zum Schluß in einer Schleife aus:

for(int i = 0; i < AnzahlSuchbegriffe; i++)

{

if(Gefunden[x] > 0) // oder einfach if(Gefunden[x])

{

cout << "Das Wort " << Eingabe[x] << " kommt " /* << Gefunden[x] << "mal " */ << "vor" << endl;}

}

Die Suchwortliste gehst du bei jedem neu eingelesenen Wort durch. Leichter geht das Einlesen einzelner Wörter - als Anzahl zusammenhängenderNicht-Leerzeichen - einfach mit cin and friends.

Probier spaßeshalber mal folgendes:

#include <fstream.h>

void main()

{

char str[128];

ifstream in("tst.txt");

while(1)

{

in >> str;

if( in.good() )

cout << str << endl;

else

break;

}

in.close();

}

Du mußt nur eine beliebige Datei "tst.txt" im Verzeichnis, in dem die *.exe liegt, anlegen. Das prg liest die Wörter und gibt sie, eins pro Zeile, wieder aus.

Viel Spaß!

(Uh, hoppla, ist mir doch glatt quick'n'dirty ein while(1) untergekommen, sorry, schaffst du bestimmt viel anständiger ;) )

<FONT COLOR="#a62a2a" SIZE="1">[ 15. Oktober 2001 16:15: Beitrag 3 mal editiert, zuletzt von captain haddock ]</font>

Geschrieben

Hihi, die Datei darf natürlich nicht beliebig sein, kein Wort darf länger als 127 Zeichen sein, oder anders - spätestens jedes 127te Zeichen muß ein whitespace sein , ist klar, gelle :)

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