000
23.06.2004, 12:44 Uhr
~Alex3333
Gast
|
Hallo, habe folgendes Problem, ich soll den DOSen DIR Befehl in C nachbilden. Da die Ausgabe sortiert nach der letzten Datenänderung erfolgen soll, lege ich die Daten in einer einfach verketteten Liste ab. Doch das klappt nicht so ganz, am Ende steht nur der letzte Eintrag mehrmals in der Liste, die Anzahl der Listenelemente stimmt aber. Es scheint so als würde ich jedem Zeiger der Liste immer den gleichen Dateneintrag zuweisen. Ich finde aber meinen Fehler einfach nicht Wäre nett, wenn mir jemand helfen könnte... Hier der komplette Code. Der Fehler muss in der liste.c sein. Main Funktion befindet sich in mydir.c Kompiliert wird der Code problemlos macht aber nicht so ganz was es soll.
| C++: |
/******************************************************************************/ /* liste.c */ /******************************************************************************/ #include "liste.h" #include "datetime.h"
struct Liste *current;
void Ausgabe(_finddata_t *entrylist){ //Gib Daten aus struct tm DataInfo; convertDate(entrylist->time_write,&DataInfo.tm_mday, &DataInfo.tm_mon, \ &DataInfo.tm_year); convertTime(entrylist->time_write,&DataInfo.tm_hour, &DataInfo.tm_min); printf("%02i.%02i.%4i %02i:%02i ",DataInfo.tm_mday, \ DataInfo.tm_mon,DataInfo.tm_year,DataInfo.tm_hour,DataInfo.tm_min); if(entrylist->attrib & _A_SUBDIR) printf("<DIR> %s\n", \ entrylist->name); else printf(" %-9i%s\n",entrylist->size, entrylist->name); }
int ListVgl(time_t x, time_t y){ //Vergleiche letzte Änderung double diff = difftime(x,y); //x-y printf("%f\n",diff); if(diff<=0) return (1); else return (0); }
void insert(struct _finddata_t *entry){ struct Liste *dummy=(struct Liste*)malloc( sizeof(struct Liste) ); if(dummy){ dummy->dirEntry=entry; dummy->next=NULL; if(!(hd->head)) //Kein Eintrag in der Liste, erstes Element { hd->head=dummy; printf("Kopf eingefügt\n"); } else { if(ListVgl(hd->head->dirEntry->time_write,dummy->dirEntry->time_write)) { //Eintrag kleiner Head, Element vor Head setzen. Hier ist bereits Head = Dummy! Wieso?!? Ausgabe(hd->head->dirEntry); Ausgabe(dummy->dirEntry); dummy->next=hd->head; hd->head=dummy; printf("Vor Kopf eingefügt\n"); } else //Eintrag kommt irgendwo in die Liste, suche und füge ein. { current=hd->head; while(current->next && ListVgl(current->dirEntry->time_write,dummy->dirEntry->time_write)) { current=current->next; } dummy->next=current->next; current->next=dummy; printf("Mitten eingefügt\n"); } } } }
void initIteration(void){ //Liste durchlaufen und ausgeben current=hd->head; Ausgabe(current->dirEntry); struct _finddata_t *DirEntry; while(DirEntry=getnext()) { Ausgabe(DirEntry); } }
struct _finddata_t *getnext(void){ if(current->next) { current=current->next; return(current->dirEntry); } else return 0; }
void destroyList(void){ //Speicher freigeben struct Liste *dummy; current=hd->head->next; while(current){ dummy = current->next; free(current->dirEntry); free(current); current=dummy; } }
|
| C++: |
/******************************************************************************/ /* mydir.c */ /******************************************************************************/ #include "datetime.h" #include "liste.h" struct ListHead *hd;
int main(int argc, char **argv) { hd=(struct ListHead *) malloc(sizeof (struct ListHead)); hd->head=NULL; struct _finddata_t entry; int done = 0; long handle; char sSearchDir[256]; if(argc<=1) { strcpy( sSearchDir, "*.*" );} else{ sprintf(sSearchDir,"%s\\*.*",argv[1]); } if ((handle = _findfirst(sSearchDir,&entry))!= -1L) { while(!done) { Ausgabe(&entry); insert(&entry); done = _findnext(handle, &entry); } _findclose(handle); } else {printf("*** Kein Eintrag gefunden ***");}
initIteration();
destroyList(); //int leak = _CrtDumpMemoryLeaks();
}
|
| C++: |
/******************************************************************************/ /* liste.h */ /******************************************************************************/ #ifndef __LISTE_H #define __LISTE_H #include <io.h> #include <stdlib.h> #include <stdio.h> #include <string.h>
struct Liste{ struct _finddata_t *dirEntry; struct Liste *next; };
struct ListHead{ struct Liste *head; };
extern struct ListHead *hd;
extern void Ausgabe(_finddata_t *entrylist); extern void insert(struct _finddata_t *entry); extern void initIteration(void); extern struct _finddata_t *getnext(void); extern void destroyList(void); #endif
|
| C++: |
/******************************************************************************/ /* datetime.c */ /******************************************************************************/ #include "datetime.h"
void convertDate(time_t time, int *day, int *month, int *year) { struct tm zeitdaten; zeitdaten = *localtime(&time); *month = zeitdaten.tm_mon + 1; *day = zeitdaten.tm_mday; *year = zeitdaten.tm_year + 1900; }
void convertTime(time_t time, int *hour, int *min) { struct tm zeitdaten; zeitdaten = *localtime(&time); *hour = zeitdaten.tm_hour; *min = zeitdaten.tm_min; }
|
| C++: |
/************************************/ /* datetime.h */ /************************************/ #ifndef __datetime_h #define __datetime_h #endif #include <time.h>
extern void convertDate(time_t time, int *day, int *month, int *year);
extern void convertTime(time_t time, int *hour, int *min);
|
|