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; }
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.
Mueller Best's schrieb: > Hallo, ich habe ein datei, die ausgelesen und sortiert werden soll cat datei | sort MfG Klaus
Rolf Magnus schrieb: > Klaus schrieb: >> cat datei | sort > > http://partmaps.org/era/unix/award.html#uucaletter OK <datei sort
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.