From 69921855bb0fe9efe76413d52c10d1fc4f47fedf Mon Sep 17 00:00:00 2001 From: Giuseppe Marcucci Date: Mon, 19 Oct 2026 17:16:53 +0200 Subject: [PATCH] Meine eigene input.c --- Startcode/input.c | 112 ++++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 73 deletions(-) diff --git a/Startcode/input.c b/Startcode/input.c index cd4c54c..7d4fab3 100644 --- a/Startcode/input.c +++ b/Startcode/input.c @@ -1,80 +1,46 @@ -#include "input.h" // Bindet die eigene Headerdatei mit den Konstanten ein. -#include // Stellt Funktionen wie strtok(), strlen() und strncpy() bereit. -#include // Stellt die Funktion toupper() zum Umwandeln in Grossbuchstaben bereit. -#include -#include +#include "input.h" +#include +#include -int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) // Liest Woerter aus einer Datei und gibt deren Anzahl zurueck. +// TODO: +// eine Funktion implementieren, die ein einzelnes Wort aus einer Textdatei (words.txt) einliest +// und als C-String zurückgibt. + + +int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) // Read words from file and +// store in 'words' array { - int count = 0; + int count = 0; // zaehlt die gespeicherten Woerter - /*Als Parameter fuer Words wird der Spaltenanzahl gegeben, der - bekannt werden muss, sonst ist die maximale Laenge des Wortes nicht eindeutig.*/ - - FILE *file_zeiger; - file_zeiger = fopen("words.txt", "r"); - /*Die Datei mit den Woertern wird geoeffnet.*/ - - if(file_zeiger == NULL){exit(1);}; - /*Code wird terminiert in dem Fall, dass die Datei nicht eingelesen werden kann.*/ - - char Text_Speicher[1000]; - /*1000 weil der .txt File offensichtlich weniger als 1000 Characters besitzt, - und passt somit in dieses Array.*/ - /*Wir speichern den Text in einen Array, sodass wir mit Zeigerarithmetik arbeiten - koennen, was fuer ein File-Pointer nicht geht. Z.B.: - (*fgets dereferenziert zeigt nicht auf das Character aus den Text auf der Addresse.) - (fgets ++ springt nicht auf die Addresse des naechsten Characters.)*/ - - int Lese_Ein = fread(Text_Speicher, 1, sizeof(Text_Speicher) - 1, file_zeiger); - Text_Speicher[Lese_Ein] = '\0'; - fclose(file_zeiger); - /*Wir kopieren die Textdatei ins Array.*/ - - char *fptr = Text_Speicher; - /*Weil man die Zeigerarithmetik nicht mit Text_Speicher machen kann.*/ - - if(fptr != NULL) + if(file == NULL || maxWordCount == 0) // keine Datei oder kein Platz { - - while(*fptr != '\0' && count < maxWordCount) - { - while(*fptr == '\n' || *fptr == ',' || *fptr == ';' || *fptr == ' ' || *fptr == '\t' || *fptr == '\r') - { - fptr++; - } - - if(*fptr == '\0') break; /*Das wuerde heissen, dass man - schon ueber den letzten Element durchgelaufen hat.*/ - - - int char_Index = 0; - while(*fptr != '\n' && *fptr != ',' && *fptr != ';' && *fptr != ' ' && *fptr != '\t' && *fptr != '\0') - { - if (char_Index < MAX_WORD_LEN - 1) { - words[count][char_Index] = *fptr; - char_Index++; - /*char_Index++ = naechste Spalte*/ - } - fptr++; - /*geht auf die naechste Addresse.*/ - - /*falls man raus aus dieser Schleife geht, heisst das, dass man - ein Wort eingelesen hat, da die oben in der Schleife benannten Characters - genau diejenige sind, die die Woerter trennen.*/ - } - - while (char_Index < MAX_WORD_LEN) - { - words[count][char_Index] = '\0'; - char_Index++; - } - /*Wir fuellen den Rest der Zeile mit \0, falls es noch - uebrigen Platz gibt (weniger Buchstaben eingelesen als es Raum in der Zeile gibt.)*/ - - count++; - } + return 0; //Raus aus dem Programm und Abbruch } - return count; + char line[MAX_LINE_LEN]; // Puffer fuer eine ganze Zeile 1024 + + while(fgets(line, MAX_LINE_LEN, file) != NULL) // jede Zeile lesen + { + char *word = strtok(line, ",; \t\r\n"); // erstes Wort der Zeile + + while(word != NULL && count < maxWordCount) // jedes Wort der Zeile + { + + if(strlen(word) != 0 && strlen(word) < MAX_WORD_LEN) // Wort gueltig? + { + strncpy(words[count], word, MAX_WORD_LEN -1); // Wort sicher ins naechste Fach kopieren + words[count][MAX_WORD_LEN -1] = '\0'; // String sicher mit '\0' abschliessen + + for(int i = 0; words[count][i] != '\0'; i++) + { + words[count][i] = toupper(words[count][i]); + + } + count++; // ein Wort mehr gespeichert + + } + word = strtok(NULL, " ,; \t\n\r"); // naechstes Wort holen + } + } + return count; // Anzahl der gespeicherten Woerter zurueckgeben } \ No newline at end of file