#include "input.h" #include #include // // HILFSFUNKTION: liest genau EIN Wort aus der Datei in 'buffer' // Rückgabe: 1 = Wort gelesen, 0 = kein Wort mehr (EOF oder Fehler) // static int readSingleWord(FILE *file, char *buffer, size_t bufferSize) { // (1) Lokale Variablen: c = aktuelles Zeichen, len = Länge des Wortes im Buffer int c; size_t len = 0; // (2) Sicherheitscheck: sind die Parameter überhaupt gültig? if (file == NULL || buffer == NULL || bufferSize == 0) { return 0; } // (3) Führende Trennzeichen überspringen // -> solange nur Komma, Semikolon oder Whitespace kommt, weiter lesen while ((c = fgetc(file)) != EOF) { if (c == ',' || c == ';' || isspace((unsigned char)c)) { continue; // Trennzeichen -> noch kein Wort } else { break; // erstes Nicht-Trennzeichen -> Start des Wortes } } // (4) Wenn direkt EOF kommt, bevor ein Wort beginnt: kein Wort mehr vorhanden if (c == EOF) { return 0; } // (5) Ersten Buchstaben des Wortes in den Buffer schreiben buffer[len++] = (char)c; // (6) Rest des Wortes lesen, bis wieder ein Trennzeichen oder EOF kommt while ((c = fgetc(file)) != EOF) { // Trennzeichen: Wort ist zu Ende if (c == ',' || c == ';' || isspace((unsigned char)c)) { break; } // (7) Nur schreiben, solange noch Platz ist (für das abschließende '\0') if (len < bufferSize - 1) { buffer[len++] = (char)c; } // Wenn kein Platz mehr ist, werden die restlichen Zeichen des Wortes ignoriert } // (8) String terminieren: am Ende ein '\0' setzen, damit es ein gültiger C-String ist buffer[len] = '\0'; // (9) 1 zurückgeben: es wurde erfolgreich ein Wort gelesen return 1; } // // HAUPTFUNKTION: liest ALLE Wörter aus der Datei und speichert sie im Array 'words' // Rückgabe: wie viele Wörter tatsächlich eingelesen wurden // int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) { // (1) Zähler, wie viele Wörter bereits eingelesen wurden unsigned int count = 0; // (2) Temporärer Puffer für EIN Wort char buffer[MAX_WORD_LEN]; // (3) Sicherheitscheck: Datei, Ziel-Array und maxWordCount prüfen if (file == NULL || words == NULL || maxWordCount == 0) { return 0; } // (4) Hauptschleife: // Solange noch Platz im words-Array ist // UND readSingleWord() noch ein Wort liefert while (count < maxWordCount && readSingleWord(file, buffer, sizeof(buffer))) { // (5) Wort aus dem Buffer sicher ins nächste freie Feld von 'words' kopieren // -> words[count] ist der nächste freie Platz strncpy(words[count], buffer, MAX_WORD_LEN); // (6) Zur Sicherheit: letztes Zeichen auf '\0' setzen (falls Wort zu lang war) words[count][MAX_WORD_LEN - 1] = '\0'; // (7) Zähler erhöhen -> nächstes Wort kommt in words[count+1] count++; } // (8) Anzahl der eingelesenen Wörter an den Aufrufer (z.B. main) zurückgeben return count; } //Erklärung des Codes für Präsentation: //In main wird eine Datei geöffnet und ein zweidimensionales Array words angelegt. //Dann wird unsere Funktion readWords(file, words, MAX_NUMBER_OF_WORDS) aufgerufen. //In readWords haben wir zuerst einen Zähler count, der mitzählt, wie viele Wörter wir schon eingelesen haben, und einen temporären Buffer für ein einzelnes Wort. //Danach kommt eine while-Schleife: //while (count < maxWordCount && readSingleWord(file, buffer, sizeof(buffer))) //Die Schleife läuft so lange, wie noch Platz im Array ist und unsere Hilfsfunktion readSingleWord immer wieder ein neues Wort aus der Datei liefert. //readSingleWord kümmert sich nur darum, ein einzelnes Wort zu lesen: //Sie überspringt erst alle Trennzeichen wie Kommas, Semikolons oder Leerzeichen, //merkt sich dann das erste Nicht-Trennzeichen als Wortanfang und liest so lange weiter, bis wieder ein Trennzeichen kommt oder die Datei zu Ende ist. //Das gelesene Wort landet im buffer und wird mit '\0' beendet. //Wenn ein Wort gefunden wurde, gibt readSingleWord 1 zurück, sonst 0. //Zurück in readWords wird jedes Wort aus dem Buffer mit strncpy in das Array words[count] kopiert. //Danach wird count erhöht, sodass das nächste Wort an die nächste freie Stelle geschrieben wird. //Wenn keine Wörter mehr gelesen werden können, gibt readWords die Gesamtzahl der eingelesenen Wörter zurück.