generated from freudenreichan/info2Praktikum-Wortsalat
128 lines
4.6 KiB
C
128 lines
4.6 KiB
C
#include "input.h"
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
//
|
|
// 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.
|