Forum: Compiler & IDEs Datei einlesen und Sortieren


von Mueller B. (frankyfarell)


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;
 }

von Karl H. (kbuchegg)


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.

von Klaus (Gast)


Lesenswert?

Mueller Best's schrieb:
> Hallo, ich habe ein datei, die ausgelesen und sortiert werden soll

cat datei | sort

MfG Klaus

von Rolf Magnus (Gast)


Lesenswert?


von Klaus (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Klaus schrieb:
>> cat datei | sort
>
> http://partmaps.org/era/unix/award.html#uucaletter

OK

<datei sort

von Mueller B. (frankyfarell)


Lesenswert?

Danke Karl , mein problem ist genau wie du sagst Die Schnittstelle 
zwischen die zwei funktion , ich wuerde hier ein Array von Pointern 
verwenden. aber mir ist es schwer die Anwendungen

von Rolf Magnus (Gast)


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.

von Andreas Kasper (Gast)


Lesenswert?

Du kannst auch folgendes Verfahren verwenden um deine Zahlen (Daten) 
direkt beim Einlesen zu sortieren:

http://www.informatiktreff.de/materialien/sek_ii/algorithmen/baum/baum.htm#baumsortieren

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.