Psycho~zicke Geschrieben 17. November 2008 Teilen Geschrieben 17. November 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 17. November 2008 Teilen Geschrieben 17. November 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Psycho~zicke Geschrieben 17. November 2008 Autor Teilen Geschrieben 17. November 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Psycho~zicke Geschrieben 17. November 2008 Autor Teilen Geschrieben 17. November 2008 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)); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 17. November 2008 Teilen Geschrieben 17. November 2008 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'. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Psycho~zicke Geschrieben 17. November 2008 Autor Teilen Geschrieben 17. November 2008 Super jetzt Funktioniert es wie es soll )) danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.