Wörter zeilenweise einlesen/sortieren

BasicC

Erfahrenes Mitglied
  1. Gegeben ist eine Textdatei dict-american.txt einer unsortierten amerikanischen Wort- liste. Schreiben Sie ein Programm zu verschiedenen lexikalischen Sortierungen dieser Wörter.
    1. a) Lesen Sie die Wortliste zeilenweise ein (siehe man fgets) und speichern Sie alle Wörter in Einlesereihenfolge in einem statischen array von char-pointern (ein Wort pro Feldelement) .
      Ignorieren Sie dabei Wörter mit einer Länge von weniger als 4 Zeichen. (Nützliche Funktion: strdup() zur Erzeugung einer Kopie eines strings.)

      Gehen Sie für das Einlesen von einer maximalen Wortlänge von 60 Zeichen und für die Länge des statischen arrays von max. 250 000 Wörtern aus. Beide Grenzwerte sind während des Einlesens auf Überschreitung zu prüfen, ggf. mit Meldung an den Benutzer (testen Sie dies mit temporär herunter gesetzen Obergrenzen).

    2. b) Geben Sie den Inhalt des arrays auszugsweise aus, indem Sie die ersten N Wörter und die letzten N Wörter des arrays zeilenweise und nummeriert ausgeben (mit z.B. N=20).

    3. c) Sortieren Sie das array lexikalisch aufsteigend (siehe man strcmp) mithilfe der Sys- tembibliotheks-Funktion qsort() (siehe man qsort) und geben Sie das sortierte array wie in b) auszugsweise aus.

    4. d) wie c), aber sortieren Sie lediglich nach dem dritten Zeichen im Wort.

    5. e) wie c), aber sortieren Sie nach der Länge, d.h. der Anzahl der Zeichen des Wortes (primäres Sortierkriterium), bei gleicher Wortlänge sollen die Wörter wiederum lexi- kalisch sortiert sein (sekundäres Sortierkriterium).

      C:
      #include <stdio.h>
      
      #include <stdlib.h>
      
      
      
      int main(void) {
      
          FILE *fd;
      
          char *datei = "/Users/xyz/Desktop/Informatik 2/dict-american.txt";
      
          int nRet;
      
          size_t *t = malloc(0);
      
         
      
          char **gptr = malloc(sizeof(char*));
      
          *gptr = NULL;
      
         
      
          if ( (fd = fopen(datei,"r")) == NULL) {
      
              fprintf(stderr, "\nKonnte Datei %s nicht öffnen!", datei);
      
              return 1;
      
          }
      
          while( (nRet=getline(gptr, t, fd)) > 0)
      
              fputs(*gptr,stdout);
      
          return 0;
      
      }

      Bis jetzt bekomme ich einfach die Liste mit den Wörtern der Textdatei zurück geliefert.

      Mein Gedanke wäre jetzt ein if schleife einbauen arrays deklarieren nur kommt mir Aufgabe 2a) wie hierogylphen zu Augen.
 
Zuletzt bearbeitet von einem Moderator:

cwriter

Erfahrenes Mitglied
Mein Gedanke wäre jetzt ein if schleife einbauen arrays deklarieren nur kommt mir Aufgabe 2a) wie hierogylphen zu Augen.
Mhm. Hast du es denn gelesen? Die Aufgabe verlangt fgets(), nicht getline().
if-Schleifen gibt es nicht. Was genau soll malloc(0) denn machen?
Dann wird ein Statischer Array von 250'000 Wörtern verlangt. Auf den Stack würde ich das nicht tun, sondern eher halt einmal mit malloc so einen Array generieren.
Grenzwerte prüfen sollte noch knapp gehen.

Strdup solltest du verwenden, um vom temporären Speicher von fgets() in den Array zu kopieren.
Bis jetzt bekomme ich einfach die Liste mit den Wörtern der Textdatei zurück geliefert.
Naja, du liest es zeilenweise ein und gibst es direkt wieder aus... Dennoch glaube ich nicht, dass das so funktioniert. malloc(0) ist schon falsch, den Pointer dann noch zu verwenden ist böse...

Gruss
cwriter
 

BasicC

Erfahrenes Mitglied
Wie sollte ich denn anfangen wie wären meine ersten Ansätze ?
Gibt es so blöcke die du mir erklären kannst

1. hier kommt die Deklaration des Files z.B.
2. hier die fubktion mit fputs() und getline
2. hier was mit stdup

So eine grobe Übersicht wäre mir lieb oder wirklich tipps wie man anfangen könnte.
 

cwriter

Erfahrenes Mitglied
So eine grobe Übersicht wäre mir lieb oder wirklich tipps wie man anfangen könnte.
Die hast du eigentlich schon in der Anleitung.
Du bist mittlerweile bekannt dafür, am liebsten direkt eine Fertiglösung zu bekommen. Probier es erstmal selber (und nein, dein bisheriger Code gilt nicht als Probieren: Ich bezweifle, dass der überhaupt läuft).
Du wirst es nicht glauben, aber sich eine Struktur zu überlegen gehört genauso zum Programmieren wie das Eintippen.
Beginne doch einmal damit, alles in einen Array einzulesen, und es dann Rückwarts wieder auszugeben, um die Korrektheit zu testen.

cwriter
 

BasicC

Erfahrenes Mitglied
C:
#include <stdio.h>

#include <stdlib.h>





int main () {

    FILE *fp;

    char str[8];

  

  

    fp = fopen("/Users/********/Desktop/TI SS18/dict-american.txt" , "r");

    if(fp == NULL) {

        perror("Datei konnte nicht gefunden werden!\n");

        return 1;

    }

    if( fgets (str, 8, fp)!=NULL ) {

      

        puts(str);

    }

    fclose(fp);

  

    return(0);

}

So habe erstmal geschafft das erste Wort auszugeben :)
Wie fahre ich fort ?
 

cwriter

Erfahrenes Mitglied
Beginne doch einmal damit, alles in einen Array einzulesen, und es dann Rückwarts wieder auszugeben, um die Korrektheit zu testen.
So habe erstmal geschafft das erste Wort auszugeben :)
Wie fahre ich fort ?
Du liest mehrere Wörter in einen Array von char-Pointern ein.

Ich verliere langsam die Geduld mit dir. Höre endlich auf, dich durchzumoglen! Es gibt hunderte von Anleitungen, wie du die Zeilen einer Datei in einen Array lesen kannst. Google doch einfach mal. Dieses Forum ist nicht dazu da, immer dieselben Basics zu erklären und Beispiele zu machen. Wenn du etwas gefunden hast und es nicht verstehst, kannst du Fragen stellen, aber wir sind kein "Wir machen dir die Hausaufgaben"-Forum. Mittlerweile solltest du das verstanden haben.

cwriter
 

BasicC

Erfahrenes Mitglied
Ist ja gut ich will ja gar keine komplette Lösung ich möchte nur ein Tipp wie die nächste Funktion heißen könnte oder was ich anders machen muss deine Antwort darauf war du liest mehrere Wörter in ein char pointer, so was wäre denn das richtige in 2a steht ja das ich die Wörtee zeilenweise einlesen soll ich habe das erste Wort bekommen.
Wie kann ich das nächste bekommen?
 

cwriter

Erfahrenes Mitglied
Wie kann ich das nächste bekommen?
Nochmals fgets() aufrufen? Vielleicht mit mehr als maximal 8 Zeichen...
Antwort darauf war du liest mehrere Wörter in ein char pointer,
Nein, ich sagte, lies es in einen char Pointer Array. Jedes Wort ist dann ein char Pointer im Array.
was ich anders machen muss
Das ist ok, wenn du schon recht guten Code hast, oder zumindest Code, wo ernsthafte Arbeit geleistet wurde. Du lieferst aber immer absolut minimalistischen Code, fragst dann, was du anders machen solltest. Dann bekommst du eine Antwort, setzt vielleicht 10% davon um und fragst "was jetzt?".
Ob du auf einmal eine fertige Lösung verlangst oder sie in Bruchstücken erfragst kommt echt auf dasselbe raus. Fragen zum Sortierungsteil wären ja ok, das ist nicht ganz trivial, aber die Basics solltest du mittlerweile kennen (auch, weil der Kurs ja Informatik 2 heisst...).

cwriter
 

BasicC

Erfahrenes Mitglied
C:
int main () {

    FILE *fp;

    char array[250000];

   

   

    fp = fopen("/Users/********/Desktop/TI SS18/dict-american.txt" , "r");

    if(fp == NULL) {

        perror("Datei konnte nicht gefunden werden!\n");

        return 1;

    }

    if( fgets (array, 60 , fp)!=NULL ) {

       

        puts(array);

    }

    if( fgets (array, 60, fp)!=NULL ) {

       

        puts(array);

    }

    fclose(fp);

   

    return(0);

}

also im Prinzip so aber kann man dies nicht kürzer machen ?