www.mikrocontroller.net

Forum: Compiler & IDEs Datei einlesen und Sortieren


Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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;
 }

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
   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.
        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.

    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.

Autor: Klaus (Gast)
Datum:

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

cat datei | sort

MfG Klaus

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Klaus (Gast)
Datum:

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

OK

<datei sort

Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: Andreas Kasper (Gast)
Datum:

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

http://www.informatiktreff.de/materialien/sek_ii/a...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.