C: Wort in einer Textdatei suchen
-
Hallo zusammen!
Ich hätte da eine Frage. Meine Kollegen und ich sind daran ein Programm zu schreiben. Diese Programm sollte so funktionieren: Man wird gefragt über welches Land man gerne Informationen haben will. Mit der Eingabe z.B Deutschland wird im Text nach Deutschland gesucht und sollte dann eine gewisse Anzahl Zeilen ausgeben inklusive mit dem Landesname.
Da kommt unsere Frage: Wie kann man ein Wort suchen in einer Textdatei und dieses dann ausgeben?
Das File können wir öffnen und die Datei haben wir auch bereits erstellt.
Ganz wichtig ist aber:
Es muss in C geschrieben sein und nicht C++ oder C#.
Grüsse Daniel
-
Datei einlesen, Zeichenkette suchen. Du willst dazu vermutlich mal einen Blick auf
http://www.cplusplus.com/reference/clibrary/cstdio/
und
http://www.cplusplus.com/reference/clibrary/cstring/
werfen. (Auch wenn das eine C++-Referenz ist, so ist die Dokumentation der C-Bibliothek (die Teil von C++ ist) doch auch für C geeignet)Aber: Deine Frage klingt ganz danach, als wärst du totaler Anfänger, der noch nie irgendwie mit Zeichenketten in C zu tun hatte. Das Thema ist erfahrungsgemäß für Anfänger leider ziemlich unintuitiv. Die Referenzen alleine werden dir nicht helfen, du wirst bloß fehlerhaften Code zusammenbauen. Das Thema ist aber auch zu groß, um es in einem Forum zu erklären. Falls du tatsächlich keine Ahnung von Arrays und Zeichenketten haben solltest, dann schnapp dir unbedingt ein gutes C Buch (solltest du sowieso tun!), z.B. K&R. Nimm nichts aus dem Galileo-Verlag, nichts wo schneller Erfolg versprochen wird und nichts, wo C/C++ draufsteht!
-
Ja, da hast du recht
Aber Übung macht den Meister
Aber ein totaler Anfänger in C bin ich eher nicht, habe schon einige Module absolviert. Ich kenne die Basics.
Aber nun zurück zum Programm. Also du würdest vorschlagen die Textdatei in einen String zu speichern? Und dann das Wort suchen?
Wir haben schon einige Sachen versucht, die aber nicht richtig funktionieren wollten.
Ich würde es persönlich so machen: Die Eingabe wird mit jedem Wort verglichen(strcmp), wenn es falsch ist würde es weiter suchen, wenn es richtig ist würde es die Anzahl Zeilen ausgeben. Wäre dies eine Lösung oder eher nicht?
-
Wenn die Datei Trennzeichen am Ende einer Zeile enthalten kann, kann auch der Suchbegriff umbrochen sein, was eine entsprechende Formatierung des Textes vor der Suche erfordert.
Die nächste Frage wäre, soll es case-sensitive oder case-insensitive sein?
Für ersteres könnte die Funktion strstr deine Wahl sein, für den Fall case-insensitive (was meine Wahl wäre) kannst du dir selbst etwas schreiben.
Das wären die sogenannten naiven Algorithmen.Dann gibts da noch diverse andere u.U. effizientere Algorithmen, deren Beschreibung du unter "String-Matching" im Web finden kannst.
Interessant wird es, wenn du auch fehlertolerante Eingaben zulässt.
Stichwort: Unscharfe Suche.
Eingabe ist z.B. Duschland oder Deuschland und das Programm schlägt Deutschland als Suchbegriff vor - also prinzipiell so wie es Google macht, wenn man sich bei der Eingabe des Suchbegriffs vertippt.
-
swissboy82 schrieb:
Aber nun zurück zum Programm. Also du würdest vorschlagen die Textdatei in einen String zu speichern? Und dann das Wort suchen?
Jain. Wenn du völlig ohne nähere Informationen sagst, dass du ein Wort in einer Datei suchst, dann: Ja. Das ist eben die allgemeinste Lösung, die immer funktioniert und nicht schwer zu bauen ist.
Wenn man näheres über die Datei oder was das Programm überhaupt für einen Zweck hat wüsste, dann kann man das noch beliebig optimieren, was Datenstruktur und Algorithmen angeht. CJosef hat da schon einen kleinen Ausblick gegeben.
Wir haben schon einige Sachen versucht, die aber nicht richtig funktionieren wollten.
Ist ja schön. Da ihr ja die Basics kennt, bekommt ihr das ja alleine geregelt und könnt euren hochgeheimen Code mit euren hochgeheimen Problemen weiter im Geheimen verbessern.
Ich würde es persönlich so machen: Die Eingabe wird mit jedem Wort verglichen(strcmp), wenn es falsch ist würde es weiter suchen, wenn es richtig ist würde es die Anzahl Zeilen ausgeben. Wäre dies eine Lösung oder eher nicht?
Wieso wortweise statt strstr? Vielleicht macht es bei deinem Dateiformat und dem Einstazzweck des Programms Sinn und ist supereffizient. Vielleicht weißt du es aber auch nicht besser. Wer weiß?
Siehst du? Das ist genau so eine Zusatzinformation die noch fehlt, um dir überhaupt eine gute Antwort geben zu können.
-
swissboy82 schrieb:
Da kommt unsere Frage: Wie kann man ein Wort suchen in einer Textdatei und dieses dann ausgeben?
Nicht besonders effizient, aber hilfreich ist der fgets Befehl.
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
Das dabei stehende Beispiel ist schon die 1/2 Miete... insbesondere wenn man statt eines ifs ein while verwendet...
Wenn das Wort Deutschland alleine in einer Zeile Deiner Textdatei steht, kannst Du mit strcmp arbeiten oder Varianten davon, ansonsten wurde der strstr auch schon erwähnt.
Ciao
MM
-
Danke für eure Hilfe! Mit strstr haben wir es geschafft. Es findet das Wort aber gibt dann alle restlichen Zeilen aus und leider stürzt es ab, aber die Zeilen werden noch ausgegeben.
Hier den Code, vielleicht kommt ihr auf den Fehler.#include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) { FILE *fp; char* returnWert; char inputRecord[5000]; char land[500]; int zaehler; zaehler=0; fp = fopen("Länder.txt", "r"); printf("Nach welchem Land Suchen sie?"); scanf("%s", &land); returnWert= fgets(inputRecord, 5000, fp); if(returnWert==NULL) { printf("File can not open, Please try again"); } while(returnWert!=NULL) { while (strstr(returnWert, land)!= NULL ) { printf("%s",returnWert); while(returnWert!=NULL) { returnWert= fgets(inputRecord, 5000, fp); printf("%s",returnWert); zaehler++; } } returnWert= fgets(inputRecord, 5000, fp); } fclose (fp); return 0; }
-
Das ist Müll. Weder fgets noch strstr halte ich für euren Fall für sinnvoll.
Wenn es um "Worte" gehen soll, dann fehlt zunächst mal die Definition.
Wenn mit "Wort" eine durch Whitespaces getrennte char-Folge gemeint ist, wäre natürlich (f)scanf sehr einfach. Außer für getrennte Wörter liefert das dann den gewünschten Erfolg, wahlweise mit oder ohne Berücksichtigung der Groß/Kleinschreibung bzw. sogar locale-spezifisch(strcoll statt strcmp).int main(int argc,char**argv) { char w[1000]; while( scanf("%999s",w)==1 ) if( !strcmp(w,argv[1]) ) puts("gefunden"); return 0; }
und dann Aufruf via
prg Deutschland < datei.txt
-
Schau mal selber wann du die Fehlermeldung
"File can not open,.."
machst.
Du versuchst das bei einem fgets festzustellen. Aber da grifst du ja schon auf die Datei zu.In deinem Programm reicht jeweils eine Zeile mit fgets und eine mit strstr aus.
Aber Wutz Version ist klar eleganter.
Aber bei Ländern wie "San Marino" habt ihr beide Probleme.
-
Wutz schrieb:
Das ist Müll. Weder fgets noch strstr halte ich für euren Fall für sinnvoll.
Wenn es um "Worte" gehen soll, dann fehlt zunächst mal die Definition.
Wenn mit "Wort" eine durch Whitespaces getrennte char-Folge gemeint ist, wäre natürlich (f)scanf sehr einfach....Die Betonung liegt auf wenn.
Oft möchte man aber gar nicht den kompletten Suchbegriff eingeben, sondern aus Bequemlichkeit lediglich eine (Zeichen)Buchstabenfolge, die
in ihm vorkommt.Man will auch mal Suchbegriffe eingeben, die durch Leerzeichen getrennt sind, wie DirkB bereits geschrieben hat.
Was ist hier eigentlich Müll?Darum plädiere
ich immernoch für eine case-insensitive strstr Funktion.
Klar, es sind dann ein paar Zeilen Code mehr, das Ergebnis herauszufiltern. Na und?const char* stristr ( const char* s1, const char* s2 ) { // TODO .... }