Veröffentlicht 17. November 200816 j Hallo ihr lieben, ich habe folgendes Problem. Ich soll ein programm schreiben das Daten aus einer Tabelle einliest die Tabelle dann ordnet und in eine andere Datei ausgibt. Bis auf das ordnen klappt auch alles wunderbar. Vllt wisst ihr ja wo mein fehler ist. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 15 #define MAXCHAR 50 #define True 1 #define False 0 void main() { /* Deklaration FILE-Zeiger */ FILE *fQuelle; FILE *fZiel; /* Daclaration der Variablen */ char *sZeile2[MAX]; char sZeile[MAXCHAR]; int iZaehler; int iSortier; int iTausch; int Pos; int i; Pos = 0; iTausch = 0; /* öffnen der Datei */ fQuelle = fopen("C:\\Kernig~1\\Lookup\\1-1-1.c","r"); fZiel = fopen ("C:\\Kernig~1\\Lookup\\test.c", "w+"); /* Überprüfung ob die Datei geöffnet werden kann */ if (fQuelle == NULL) { printf("Fehler beim Oeffnen der Datei C:\\Kernig~1\\Lookup\\1-1-1.c\n"); } for (iZaehler = 0;iZaehler < MAX ; iZaehler++) { /* Einlesen der aktuellen Zeile aus fQuelle */ fgets(sZeile, MAXCHAR, fQuelle); /* entfernen des \n */ sZeile[strlen(sZeile)-1] = 0; /* malloc macht einen Zeiger auf einen freien platz der sZeile +1 länge hat und übergibt den Zeiger an sZeile2[iZaehler] */ sZeile2[iZaehler] = malloc(strlen(sZeile)+1); /* Kopie wird von sZeile an sZeile2[iZaehler] gemacht */ strcpy(sZeile2[iZaehler], sZeile); } for (i = 1; i < MAX; i++) { iSortier = 0; for(iZaehler = 0; iZaehler < MAX - i; iZaehler++) { if(sZeile2[iZaehler+1] < sZeile2[iZaehler]) { iTausch = sZeile2[iZaehler]; sZeile2[iZaehler] = sZeile2[iZaehler+1]; sZeile2[iZaehler+1] = iTausch; iSortier = 1; } } if(!iSortier) { break; } } for (iZaehler = 0; iZaehler < MAX; iZaehler++) { /* if abfrage damit nur einma die Tabellen überschriften erscheinen */ if (Pos == 0) { printf("\nName\t Nachname\t Alter\n"); ++Pos; } /* Ausgabe der Datensätze bzw inhalte der Einzelnen Zeiger */ printf("\n%s", sZeile2[iZaehler]); fputs (sZeile2[iZaehler],fZiel); } } Danke schon mal im Vorraus. Liebe Grüße die Zicke
17. November 200816 j Das Sortieren klappt hervorragend, falls es deine Absicht war, nach den Zeigeradressen zu sortieren, denn das tust du: if(sZeile2[iZaehler+1] < sZeile2[iZaehler]) Hier vergleichst du zwei Zeiger, also zwei Speicheradressen. Das Ergebnis ist vom Inhalt dieser Strings natürlich unabhängig. Du willst aber vermutlich nach dem Inhalt der Strings sortieren. Wenn es einfach nur eine alphanumerische Sortierung sein soll, muss da schon ein strcmp auftauchen.
17. November 200816 j Ja genau ich möchte die Inhalte sortieren nicht die Zeigeradressen. So ein mist. Dann schau ich mal wie man das mit strcmp macht. danke
17. November 200816 j Super nun funktioniert es )) Habe aber trotzdem noch mal ne frage und zwar bekomme ich den ersten Datensatz (nach neuer reihenfolge) und den letzten Datensatz (nach alterreihenfolge doppelt ausgegeben. Woran kann das liegen?? Kann es leider nicht feststellen. Danke schon mal im Vorraus. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 15 #define MAXCHAR 50 #define True 1 #define False 0 int Vergleich(const void *s1, const void *s2); void main() { /* Deklaration FILE-Zeiger */ FILE *fQuelle; FILE *fZiel; /* Daclaration der Variablen */ char *sZeile2[MAX]; char sZeile[MAXCHAR]; int iZaehler; int iSortier; int iTausch; int Pos; int i; Pos = 0; iTausch = 0; /* öffnen der Datei */ fQuelle = fopen("C:\\Kernig~1\\Lookup\\1-1-1.c","r"); fZiel = fopen ("C:\\Kernig~1\\Lookup\\test.c", "w+"); /* Überprüfung ob die Datei geöffnet werden kann */ if (fQuelle == NULL) { printf("Fehler beim Oeffnen der Datei C:\\Kernig~1\\Lookup\\1-1-1.c\n"); } for (iZaehler = 0;iZaehler < MAX ; iZaehler++) { /* Einlesen der aktuellen Zeile aus fQuelle */ fgets(sZeile, MAXCHAR, fQuelle); /* entfernen des \n */ sZeile[strlen(sZeile)-1] = 0; /* malloc macht einen Zeiger auf einen freien platz der sZeile +1 länge hat und übergibt den Zeiger an sZeile2[iZaehler] */ sZeile2[iZaehler] = malloc(strlen(sZeile)+1); /* Kopie wird von sZeile an sZeile2[iZaehler] gemacht */ strcpy(sZeile2[iZaehler], sZeile); } for (i = 1; i < MAX; i++) { for(iZaehler = 0; iZaehler < MAX - i; iZaehler++) { if (strcmp(sZeile2[iZaehler+1], sZeile2[iZaehler]) <0) { sZeile2[iTausch] = sZeile2[iZaehler]; sZeile2[iZaehler] = sZeile2[iZaehler+1]; sZeile2[iZaehler+1] = sZeile2[iTausch]; } } } for (iZaehler = 0; iZaehler < MAX; iZaehler++) { /* if abfrage damit nur einma die Tabellen überschriften erscheinen */ if (Pos == 0) { printf("\nName\t Nachname\t Alter\n"); ++Pos; } /* Ausgabe der Datensätze bzw inhalte der Einzelnen Zeiger */ printf("\n%s", sZeile2[iZaehler]); fputs (sZeile2[iZaehler],fZiel); } } int Vergleich(const void *s1, const void *s2) { return (strcmp(*(char **)s1, *(char **)s2)); }
17. November 200816 j Habe aber trotzdem noch mal ne frage und zwar bekomme ich den ersten Datensatz (nach neuer reihenfolge) und den letzten Datensatz (nach alterreihenfolge doppelt ausgegeben. Woran kann das liegen?? Daran, dass du das erste Element deines Arrays als "Tauschelement" missbrauchst. Das, was da vorher drinstand, ist damit verloren, dafür hast du einen Eintrag verdoppelt. P.S.: "Voraus" mit einem 'r'.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.