Datei einlesen und Sortieren

OP #2075293
Lesenswert?
• ▲
▼
Hallo, ich habe ein datei, die ausgelesen und sortiert werden soll. ich 
habe die beide funktion nacheinander implimentiert sie laufen sehr gut 
aber aber ich kann sie nicht zusammen setzen. d.h, datei einlesen und 
gleich sortieren.
kann mir bitte jemand helfen ?, ich weiss nicht, wie ich die eingelesene 
dateien im char*array[] speichern kann um sie zu sortieren.



Datei einlesen implementiere ich so und es lauft wunderbar


  int main(void)
  {
      FILE *Inputs_file;
      char line[buffer_size];
      //char filename[150];
    int i=0, j=0, k=1;
      Inputs_file = fopen("myString.csv", "r");
      if(Inputs_file==NULL)
      {
          printf("Fehler beim Oeffnen der Datei!\n");
      exit(EXIT_FAILURE);
      }
      int count =0;
      //while(fgets(line1,sizeof(line1),pinput)!=NULL)//buf=ligne1 zeile 
einlesen
      srand((unsigned int)time(NULL));
    while (fgets(line, sizeof(line), Inputs_file)!=NULL)       /*lecture 
ligne par ligne*/
    {
      count++;
      printf ("%d: %s", count, line);
    }

     return 0;
  }

***************************************+
Sortieren wird so implimentiert es lauft auch sehr gut.

 int sortieren(char *name[])
 {

   int i,j;
      char *temp;
      for(i = 0; i < sizeof(name)/sizeof(int); i++) {
         for(j = i + 1; j < 4; j++) {
           if( (strcmp(name[i],name[j]) > 0) ) {
              temp=name[i];  //tauchen erforderlich
              name[i]=name[j];
              name[j]=temp;
           }
         }
      }
      for(i = 0; i < sizeof(name)/sizeof(int); i++)
            printf("%s\n", name[i]);
         return EXIT_SUCCESS;



   return 0;
 }
#2075338
Lesenswert?
• ▲
▼
Du hast 2 Möglichkeiten:

* entweder du lässt deine Sortierroutine so wie sie ist (*)

Dann musst du so eine Datenstruktur aufbauen


    +-------+                +---+---+---+---+---+
    |  o-------------------->|   |   |   |   |   |
    +-------+                +---+---+---+---+---+
    |  o-----------+
    +-------+      |     +---+---+---+
    |  o-------+   +---->|   |   |   |
    +-------+  |         +---+---+---+
    |       |  |               +---+---+---+---+---+---+---+
               +-------------->|   |   |   |   |   |   |   |
                               +---+---+---+---+---+---+---+

Also ein Array von Pointern, wobei jeder Pointer wiederrum auf ein 
char-Array zeigt, in dem der Text einer Zeile enthalten ist. Ohne 
dynamische Speicherallokierung wird das aber nichts. Zumindest nichts 
vernünftiges.

* oder du legst dír ein großes 2D Array an, das groß genug ist um alle 
Zeilen der Datei speichern zu können. Dann musst du allerdings deine 
Sortierroutine daran anpassen

    +---+---+---+---+---+---+---+---+---+---+
    |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+
    |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+
    |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+
    |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+
    |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+
    |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+
    |   |   |   |   |   |   |   |   |   |   |
    .                                       .
    .                                       .


PS:
Das hier
1
   for(i = 0; i < sizeof(name)/sizeof(int); i++) {
ist Unsinn. Du kannst innerhalb der Funktion nicht mit sizeof arbeiten. 
Deine Funktion bekommt lediglich einen Pointer übergeben und kein Array. 
sizeof kann man nur dann benutzen, wenn ein Array auch tatsächlich als 
Array vorliegt, was bei Funktionsargumenten niemals der Fall ist. Daher 
kannst du dir gleich eines merken: Einer Funktion, die ein Array 
bekommt, muss man die Arraygröße immer mitgeben! Sie kann diese Größe 
prinzipiell nicht feststellen.
1
        for(j = i + 1; j < 4; j++) {
Wieso 4? Eine universelle Sortierfunktion darf selbstverständlich keine 
Annahmen über irgendwelche Arraygrößen treffen, sondern muss diese Werte 
in der Argumentliste mitbekommen.

(*) Dem Prinzip nach, nachdem die beiden vorhergehenden Punkte bereinigt 
wurden.

1
    while (fgets(line, sizeof(line), Inputs_file)!=NULL)       /*lecture
Brav! Genau so macht man das! Endlich mal ein Neuling, der diesen Teil 
richtig hinkriegt. Wenn du dann in deinem ersten Teilprogramm die Datei 
auch noch schliesst, dann ist der Teil vollständig richtig.
Gast #2075479
Lesenswert?
• ▲
▼
Klaus schrieb:
> Rolf Magnus schrieb:
>> Klaus schrieb:
>>> cat datei | sort
>>
>> http://partmaps.org/era/unix/award.html#uucaletter
>
> OK
>
> <datei sort

Oder eben einfach
1
sort datei

Karl Heinz Buchegger schrieb:
> Daher
> kannst du dir gleich eines merken: Einer Funktion, die ein Array
> bekommt, muss man die Arraygröße immer mitgeben! Sie kann diese Größe
> prinzipiell nicht feststellen.

Ich würde es noch eindringlicher formulieren: Einer Funktion kann man 
kein Array übergeben! Auch wenn es manchmal so aussehen mag, ist es 
immer nur ein Zeiger auf das erste Element, der in der Funktion 
ankommt. Und damit gibt sizeof natürlich die Größe des Zeigers zurück, 
die nichts mit der Größe des Arrays zu tun hat.
Es wurde bei der Entwicklung von C als praktisch und intuitiv angesehen, 
daß Zeiger und Arrays in ihrer Verwendung sehr ähnlich sind. Aber genau 
das Gegenteil ist der Fall. Die Unterscheidung Zeiger<->Array ist so 
ziemlich das, womit C-Einsteiger die größten Schwierigkeiten haben. 
Gerade bei Funktions-Parametern sieht man das am deutlichsten, weil da 
ungeschickterweise mit der Array-Syntax ein Zeiger und nicht etwa ein 
Array definiert wird.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.