Wörter zählen in C mit fgets
-
Guten Abend,
Habe eine Lösung zum Zählen von Wörter aus Dateien mit fscanf gefunden.
Jetzt möchte ich das Gleiche mit fgets machen .
Also es soll aus einer Textdatei gelesen werden und die Wörter, die darin enthalten sind zählen.
Hatte eine Idee es mit strtok zu machen, da der Text durch z.B. Leerzeichen getrennt ist.
Mein Hauptproblem ist, das ich nicht weiß wie ich die Wortlänge eines Wortes bekomme.Ich hoffe ihr könnt mir helfen.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char * argv[]) { int zeilen, len, count; FILE *pFile; char *word; char buf[128]; if(argc != 2) { fprintf(stderr,"Anz. Argumente\n"); exit (EXIT_FAILURE); } pFile = fopen(argv[1],"rt"); if(pFile == NULL){ fprintf(stderr,"konnte Datei nicht oeffnen\n"); exit (EXIT_FAILURE); } fseek(pFile, 0 , SEEK_END); len = ftell(pFile); fseek(pFile, 0 , SEEK_SET); printf("laenge:%d\n",len); word = strtok(buf," "); while (fgets(buf,128,pFile) != NULL) { word = strtok(NULL," "); count++; } printf("%d\n",count); }
-
Häh? wieso willst du die Lange der einzelnen Wörter wissen? Außerdem passen deine Beschreibung und dein Code überhaupt nicht zusammen. Das sieht so aus, als hättest du eine alte Lösung mit scanf genommen, das scanf durch fgets ersetzt und dann ohne Nachdenken irgendwie strtok eingebaut (vielleicht weil ein Lehrer gesagt hat, du sollst es benuzten?). fgets taugt gerade nicht zum einlesen einzelner Worte, dazu ist gerade das scanf da. Daher muss man das gelesene hinterher mit strtok zerlegen, wenn man einzelne Wörter möchte. Der Ablaufplan sollte daher so aussehen:
1. Alles einlesen mit fgets.
2. Solange strtok auf dem Gelesenen benutzen, bis keine Tokens mehr da sind, dabei mitzählen.
3. Ergebnis ausgeben.Versuch das mal selbstständig umzusetzen.
Und achte auf Korrektheit deines Programms. Es ist geradezu eine Orgie von uninitialisierten Variablen, unbenutzten Variablen und unnötigen Aktionen ohne sinn (die du wohl mal gesehen, aber nicht verstanden hast). Dreh die Warnstufe deines Compilers immer auf Maximum und behandle als Anfänger Warnungen wie Fehler, bis du soweit bist, dass du die Warnungen verstehst.
-
Wie wäre es denn mit einer Stringtabelle?
Also sowas hier:
char *eingabe[] = "Hallo ich bin ein Satz";
Dann haste die Wörter alle getrennt und kannst sie so auslesen:
printf("%s", eingabe[0]); // Hallo printf("%s", eingabe[1]); // ich ...
Aber achtung!! Ich bin ein blutiger Anfänger wenns um C geht
-
ITrun90 schrieb:
Wie wäre es denn mit einer Stringtabelle?
Also sowas hier:
char *eingabe[] = "Hallo ich bin ein Satz";
Dann haste die Wörter alle getrennt und kannst sie so auslesen:
printf("%s", eingabe[0]); // Hallo printf("%s", eingabe[1]); // ich ...
Aber achtung!! Ich bin ein blutiger Anfänger wenns um C geht
Das ist so ziemlich alles falsch.
-
Hast recht -.- eben noch mal nachgeguckt...
char *eingabe[] = {"Hallo", "ich", "bin", "ein", "satz"}; printf("%s",eingabe[0]); // Hallo printf("%s",eingabe[1]); // ich
So müsste es heißen, aber das hilft dir ja dann nicht weiter, schade.
-
fgets kann das lesen auch mal mitten im Wort beenden.
Das Programm das Wörter zählt, heißt
wc
(wordcount). Dank Internet wirst du sicher irgendein Quellcode dazu finden.
-
obergefreiter91 schrieb:
Habe eine Lösung zum Zählen von Wörter aus Dateien mit fscanf gefunden.
Jetzt möchte ich das Gleiche mit fgets machen .Lass es dabei.
*scanf ist für genau diese deine Aufgabenstellung wie geschaffen, es gibt nichts besseres. Bei fgets hast du u.a. das Zeilenlängenproblem, d.h. wenn du die max. Zeilenlänge der Datei nicht kennst, schneidet fgets u.U. "früher" ab, u.a. mitten im "Wort".
Wenn du fgets üben willst, suche dir ein passenderes Beispiel.
-
das fscanf besser geeignet ist, war mir schon klar, wollt halt nur mal ein wenig herumprobieren.
Wenn ich schreibe mit fgets, dann interessiert mich sicherlich keine lösung mit wc oder sonst eine andere. Naja wie auch immer, funzt jetzt einigermaßen.#include <stdio.h> #include <stdlib.h> #include <string.h> /*zaehlen von woerter und suchen von strings*/ int main(int argc, char *argv[]) { FILE *pFile; int i, count, zaehl; char buf[128]; char *wort; char delim[]=" "; char *data; if(argc != 3) { fprintf(stderr,"ERROR: Argumente\n"); exit (EXIT_FAILURE); } pFile = fopen(argv[1],"rt"); if(pFile == NULL) { fprintf(stderr,"ERROR: oeffnen Datei\n"); exit (EXIT_FAILURE); } while (fgets(buf,128,pFile) != NULL) { if( strstr(buf,argv[2]) != NULL) { zaehl++; } data=strtok(buf,delim); if(isalpha(data[0])) { count++; } while(data = strtok(NULL,delim)) { if(isalpha(data[0])) { count++; printf("%s",buf); } } } printf("Anz. Woerter: %d\n",count); printf("wie of vorkommen %s: %d\n",argv[2],zaehl); }
-
Wenn deine Zeilen länger als 127 Zeichen sind, funktioniert das nicht mehr richtig.
Zudem gehören zumindest \t, \r und \n auch zu den Worttrennzeichen. Eigentlich alle Controlcharakter.