/* wordS_18.c */ /* Author: E. Glockner Date: Juni '06 Version: 1.7 Description: Dies ist ein einfacher Word-Splitter. Er liesst einen einfachen Text ein, gibt in einer Datei die Worte als Liste wieder aus, und in einer zweite Datei die gleiche Liste alphabetisch sortiert, und doppelte/gleiche Woerter entfernt. Man kann den Namen der zu oeffnenden Datei und den der Ausgabe als Parameter uebergeben. Falls nicht, wird danach gefragt. */ #include #include #include #include #define DEFN "word-list.txt" /* Default-Name der Ausgabedatei */ void show_help(char prog_name[80]); void parse_text(int ch_in, FILE *stream); int ordne_worte(const void *s1, const void *s2); int WORDS=0; // globale Variable - zaehlt Anzahl der Woerter main(int argc, char *argv[]) { FILE *datei1, *datei2, *datei3; char dateiname[80], dateiout[80], dateisort[80]; int ch; /* Keine Parameter? */ if(argc < 2) { printf("\nEs wurden keine Parameter uebergeben."); printf("\nBitte Name der zu oeffnenden Datei angeben...\n > "); gets(dateiname); if(strlen(dateiname) == 0) { /* 1. Check ob oeffnende Datei angegeben wurde */ printf("\nEs muss eine zu oeffnende Datei angegeben werden!"); printf("\nProgramm wird abgegrochen...\n"); show_help(argv[0]); exit(1); } } else { strcpy(dateiname, argv[1]); } /* Keine Ausgabedatei als Parameter uebergeben? */ if(argc < 3) { /* zeige Hilfe */ if((strcmp(dateiname, "-h") == 0) || (strcmp(dateiname, "-help") == 0)) { printf("\nWordS v1.7 - (C) E. Glockner (eglockner@web.de)"); show_help(argv[0]); exit(2); } printf("\nWie soll der Name der Ausgabedatei lauten?\n > "); gets(dateiout); if(strlen(dateiout) == 0) { strcpy(dateiout, DEFN); printf("\nKein Name angegeben. Standardname '%s' wird stattdessen verwendet.\n", dateiout); } } else { strcpy(dateiout, argv[2]); } printf("\n"); /* Datei oeffnen. Ausgabedatei erstellen, falls nicht vorhanden und falls Input ok */ datei1 = fopen(dateiname, "r"); if(strlen(dateiname) != 0) /* 2. Check ob oeffnende Datei angegeben wurde */ datei2 = fopen(dateiout, "w"); if(datei1 == NULL) { perror("\nFehler beim Oeffnen der zu lesenden Datei"); show_help(argv[0]); exit(1); } if(datei2 == NULL) { perror("\nFehler beim Schreiben der Ausgabedatei"); show_help(argv[0]); exit(2); } /* 1. Schritt: Datei lesen, schreiben und Inhalt und in stdout und Datei wiedergeben */ printf("\nText wird geparst...\n\n"); ch = fgetc(datei1); while(!feof(datei1)) { if(!isdigit(ch)) parse_text(tolower(ch), datei2); ch = fgetc(datei1); } fclose(datei1); fclose(datei2); /******************************************************************************/ /* 2. Schritt: Liste aus Schritt 1 einlesen, alphabetisch ordnen, und in eine neue Datei schreiben. */ if((datei2 = fopen(dateiout, "r")) == NULL) { perror("\nFehler beim Lesen"); show_help(argv[0]); exit(3); } /* Neuen Dateinamen erzeugen */ int m = strlen(dateiout); strncpy(dateisort, dateiout, (m-3)); strcat(dateisort, "sortiert.txt"); /* an Dateinamen .sortiert.txt anhaengen */ /* Hier bzw. im naechsen Schritt taucht manchmal ein Fehler auf, je nachdem ob im Namen der sortierten Datei Zahlen oder Sonderzeichen auftauchen. Ursache des Fehlers unbekannt. */ /* Neue Datei oeffnen, falls nicht vorhanden erzeugen */ if((datei3 = fopen(dateisort, "w")) == NULL) { perror("\n\nFehler beim Schreiben der sortierten Datei"); show_help(argv[0]); exit(4); } char *daten[WORDS], puffer[80]; int count; /* die Liste der Woerter einlesen */ for(count=0; count \n", prog_name); printf("\n\n-h(elp)\t\tzeigt diese Hilfe"); printf("\nfilename_input \tName der zu lesenden Datei"); printf("\nfilename_output\tName in welcher der Inhalt gepeichert wird. (Default: '%s')\n", DEFN); printf("\nFalls keine Parameter uebergeben werden, fragt das Programm danach.\n\n"); } void parse_text(int ch_in, FILE *stream) { /* Geht Zeichen einzeln durch, entfernt Symbole. Ausgabe in stdout und in Datei */ switch(ch_in) { case ' ': printf("\n"); fprintf(stream, "\n"); WORDS++; case '.': case '%': case '&': case '*': case '+': case '@': case ',': case ':': case ';': case '?': case '!': case '=': case '/': case '"': case '~': case '#': case '<': case '>': case '\\': /* \ */ case '\'': /* ' */ case '\n': case '(': case ')': case '“': break; default: putchar(ch_in); fputc(ch_in, stream); } } int ordne_worte(const void *s1, const void *s2) { return (strcmp(*(char **)s1, *(char **)s2)); }