sk8harddiefast Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Γεια σας. Θελω να φτιαξω 1 προγραμμα σε C που απλα να μου εμφανιζει τον C:\ Η λογικη είναι printf path αλλα πως οριζω πως path το ειναι ο C:\?
migf1 Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 #include <stdlib.h> ... getenv( ... ) ... ΥΓ. Επίσης: http://www.gnu.org/s/hello/manual/libc/Environment-Access.html#Environment-Access
pinball_elf Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 > #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdio.h> #include <stdlib.h> typedef enum bool {false, true} bool; bool doDirectoryListing(const char *sDir) { WIN32_FIND_DATA fdFile; HANDLE hFind = NULL; char sPath[2048]; sprintf(sPath, "%s\\*.*", sDir); if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE) /* first file */ { printf("Path not found: [%s]\n", sDir); return false; } else { sprintf(sPath, "%s\\%s", sDir, fdFile.cFileName); printf("%s\n", sPath); } while(FindNextFile(hFind, &fdFile)) //next file. { sprintf(sPath, "%s\\%s", sDir, fdFile.cFileName); printf("%s\n", sPath); } FindClose(hFind); return true; } int main(int argc, char *argv[]) { bool result = doDirectoryListing("C:"); system("PAUSE"); return 0; }
migf1 Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Ο κώδικας αυτός φίλε pinball_elf τρέχει μόνο σε Windows.
Directx Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Γεια σας. Θελω να φτιαξω 1 προγραμμα σε C που απλα να μου εμφανιζει τον C:\ Η λογικη είναι printf path αλλα πως οριζω πως path το ειναι ο C:\? Αν θες να διαβάσεις τον κατάλογο στον οποίο εκτελείται το πρόγραμμα σου (για παράδειγμα C:\MyProgram\) από C μπορείς να το κάνεις με δύο τρόπους. Ο πρώτος είναι να διαβάσεις το περιεχόμενο του argv[0] το οποίο ως επί το πλείστο περιέχει την πλήρη διαδρομή προς το εκτελέσιμο μας (πχ. C:\MyProgram\prog.exe), οπότε αρκεί να απομονώσεις τα περιεχόμενα του ως τον τελευταίο χαρακτήρα διαχωρισμού διαδρομής (\) αποκτώντας έτσι την τρέχουσα διαδρομή από την οποία εκκινήθηκε το πρόγραμμα (πχ. C:\MyProgram\). Μειονέκτημα αυτής της μεθόδου είναι ότι σε περίπτωση που το πρόγραμμα ζητήσει αλλαγή καταλόγου κατά την διάρκεια της εκτέλεσης του τα περιεχόμενα του argv[0] δεν ανανεώνονται. Ο δεύτερη τρόπος για να διαβάσεις το τρέχον κατάλογο στον οποίο εκτελείται το πρόγραμμα και η οποία ενημερώνεται για κάθε αλλαγή του κατά την διάρκεια της εκτέλεσης είναι η χρήση της ρουτίνας getcwd. Η ρουτίνα αυτή ανήκει στο C-POSIX Standard (ο μεταφραστής μου την δηλώνει στην βιβλιοθήκη dir.h). Ακολουθεί ένα μικρό πρόγραμμα που διαβάζει την διαδρομή εκκίνησης του προγράμματος με αυτές τις δυο μεθόδους: > /* Get startup path using stdio.h or dir.h, xdir. */ #include <stdio.h> #include <string.h> #include <dir.h> /* POSIX */ int main(int argc, char *argv[]) { char szPath[bUFSIZ] = ""; /* Find last directory separator chr (\) and copy up to it, to szPath. */ for(int lastSep = strlen(argv[0]); lastSep >= 0; lastSep--) if(argv[0][lastSep] == '\\') { strncpy(szPath, argv[0], lastSep + 1); break; } printf(" argv[0]= %s\n", szPath); /* Do the same using POSIX getcwd (recommended) */ if(getcwd(szPath, sizeof(szPath))) printf(" getcwd = %s\n", strcat(szPath, "\\")); else printf(" getcwd error!\n"); printf("\nPress Enter to exit.."); getchar(); return 0; } Καλή συνέχεια!
παπι Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Ο κώδικας αυτός φίλε pinball_elf τρέχει μόνο σε Windows. Σου λεει ο TS C:\
pinball_elf Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Το πρόγραμμα το έδωσα εσκεμμένα για Windows, επειδή ζητήθηκε το path για τον κατάλογο "C:", από το οποίο συμπέρανα προσωπικά ότι πρόκειται για windows. Ορίστε και μία λύση για Unix/Linux: > #include <sys/types.h> #include <dirent.h> #include <stdio.h> typedef enum bool {false, true} bool; static bool doDirectoryListing(const char *sDir); static bool doDirectoryListing(const char *sDir) { DIR *DIRp struct dirent *direntp if ((DIRp=opendir(sDir)) == NULL) { fprintf(stderr, "[ERROR]: cannot open %s\n", sDir); return false; } while ((dirp=readdir(dp))!=NULL) fprintf(stdout,"%s\n", dirp->d_name); closedir(DIRp); return true; } int main (int argc, char ** argv) { bool result = false; result = doDirectoryListing("C:"); exit (0); }
migf1 Δημοσ. 24 Οκτωβρίου 2011 Δημοσ. 24 Οκτωβρίου 2011 Έχετε δίκιο παιδιά, δεν πήγε το μυαλό μου C:\ == Windows, που φυσικά ισχύει! Ορίστε πάντως η δική μου cross-platform πρόταση: > #include <stdio.h> #include <stdlib.h> #ifdef _WIN32 #include <direct.h> #define my_getcwd _getcwd #define SEPAR '\\' #else #include <unistd.h> #define my_getcwd getcwd #define SEPAR '/' #endif int main( void ) { char curpath[ FILENAME_MAX ]; char *cp = NULL; if ( !my_getcwd( curpath, sizeof( curpath ) ) ) exit( EXIT_FAILURE ); printf ("current directory: %s\n", curpath); for ( cp=curpath; *cp && *cp != SEPAR; cp++) ; if (*cp) *++cp = 0; printf ("current device: %s\n", curpath); exit( EXIT_SUCCESS ); }
sk8harddiefast Δημοσ. 24 Οκτωβρίου 2011 Μέλος Δημοσ. 24 Οκτωβρίου 2011 Και αν προκειται να το φτιαξω σε UNIX? Γιατι τρεχω BSD οποτε θα ζητησω να εμφανιζει το / Βασικα αυτο που θελω ειναι να φτιαξω εναν File Manager αλλα το πρωτο μου κολλημα ειναι να μου εμφανιζει το / , /usr , /etc και λοιπα και να μπορω να κινηθω μεσα τους και να μπορω να παρω λιστα των αρχειων που εχουν μεσα! Δεν ξερω καλα C αλλα πιστευω πως με αρκετη προσπαθεια και καθοδηγηση θα μαθω πολλα Please. Mην μου στειλετε ετοιμο το προγραμμα. Πειτε μου την λόγικη και ποιες εντολες θα χρειαστω γιατι θελω να ζοριστω για να μαθω!!!!!
Directx Δημοσ. 25 Οκτωβρίου 2011 Δημοσ. 25 Οκτωβρίου 2011 Και αν προκειται να το φτιαξω σε UNIX? Γιατι τρεχω BSD οποτε θα ζητησω να εμφανιζει το / Βασικα αυτο που θελω ειναι να φτιαξω εναν File Manager αλλα το πρωτο μου κολλημα ειναι να μου εμφανιζει το / , /usr , /etc και λοιπα και να μπορω να κινηθω μεσα τους και να μπορω να παρω λιστα των αρχειων που εχουν μεσα! Δεν ξερω καλα C αλλα πιστευω πως με αρκετη προσπαθεια και καθοδηγηση θα μαθω πολλα Please. Mην μου στειλετε ετοιμο το προγραμμα. Πειτε μου την λόγικη και ποιες εντολες θα χρειαστω γιατι θελω να ζοριστω για να μαθω!!!!! Αν αυτό που ζητάς να γράψεις θέλεις να μοιάζει με κάποιο OFM συνολικά απαιτείται ικανή εμπειρία σε διάφορα ζητήματα, από ρουτίνες του File System για να διαβάζεις καταλόγους & αρχεία (βλ. προγραμματάκια που δημοσιεύθηκαν σε ανώτερες αναρτήσεις), ρουτίνες ανάγνωσης του πληκτρολογίου και φυσικά ρουτίνες σχεδίασης των αποτελεσμάτων στην οθόνη σε μορφή λίστας (θα πρέπει να λάβεις υπόψη σου διάφορες στάνταρτ δυνατότητες -βλ. scrolling). Σε πιο τεχνικό επίπεδο θα πρέπει να οργανώσεις τα αποτελέσματα που λαμβάνεις από τις ρουτίνες του File System σε δομές δεδομένων (βλ. λίστες ή πίνακες) που θα σου επιτρέπουν να ξεχωρίζεις μεταξύ καταλόγου (ώστε ύστερα να μπορείς να μπαίνεις ή να φεύγεις από αυτόν) και αρχείου. Εντολές πέραν εκείνων του File System δεν μπορώ να σου προτείνω διότι ασχολούμαι με Windows και οι εντολές γραφικών (βλ. ncurses ?) για παράδειγμα ή οι εντολές χαμηλής πρόσβασης στο πληκτρολόγιο (termio?) διαφέρουν από OS σε OS οπότε θα πρέπει να σε κατατοπίσουν όσοι φίλοι προγραμματίζουν UNIX. Γενικά, αυτό που ζητάς δεν είναι κάτι που μπορεί να γίνει άμεσα (συνολικά) από έναν αρχάριο σε C, αν όμως το δοκιμάσεις συμφωνώ ότι θα μάθεις πολλά. Υ.Γ. Αν το UI το γράψεις σε κάποιο GUI τότε τουλάχιστον γλυτώνεις μεγάλο κόπο όσον αφορά την οπτικοποίηση των αποτελεσμάτων.
KostasXantho Δημοσ. 25 Οκτωβρίου 2011 Δημοσ. 25 Οκτωβρίου 2011 Tη λογική πρεπει να την βρεις μόνος σου
sk8harddiefast Δημοσ. 27 Οκτωβρίου 2011 Μέλος Δημοσ. 27 Οκτωβρίου 2011 Και πως θα προσθεσω GUI στη C? Μπορειται σας παρακαλω να με καθοδηγησετε στο τι πρεπει ακριβως να μαθω? Links? Tutorials? Kαι αν γινεται στα Ελληνικα γιατι με βοηθαει να τα καταλαβαινω ποιο ευκολα
migf1 Δημοσ. 27 Οκτωβρίου 2011 Δημοσ. 27 Οκτωβρίου 2011 Και πως θα προσθεσω GUI στη C? Μπορειται σας παρακαλω να με καθοδηγησετε στο τι πρεπει ακριβως να μαθω? Links? Tutorials? Kαι αν γινεται στα Ελληνικα γιατι με βοηθαει να τα καταλαβαινω ποιο ευκολα Πριν πας σε GUI, πρέπει πρώτα να μάθεις να χειρίζεσαι καλά τη γλώσσα. Σε τι επίπεδο βρίσκεσαι; ΥΓ. Από cross-platform GUIs το GTK+ είναι μάλλον το πιο δημοφιλές (αλλά όπως όλα τα GUI προϋποθέτει να ξέρεις ήδη καλά τη γλώσσα).
sk8harddiefast Δημοσ. 27 Οκτωβρίου 2011 Μέλος Δημοσ. 27 Οκτωβρίου 2011 Λιγο πανω απο το 0! Ξερω λιγα πραγματα (printf, scanf, if-else.etc) και εφταξα και ενα calc. Μετα σκεφτηκα τι αλλο να φτιαξω για να μαθω καλυτερα αλλα οσα σκεφτηκα μου φανηκαν πολυ δυσκολα. Ισως αυτο η ενας text ediror μου φανηκαν ποιο προσιτα. Στην θεωρια τουλαχιστον!
migf1 Δημοσ. 27 Οκτωβρίου 2011 Δημοσ. 27 Οκτωβρίου 2011 Τότε έχεις πολύ δρόμο ακόμα! Αυτά που διάλεξες δεν είναι εύκολα για κάποιον που ξεκινάει τώρα. Ξεκίνα με πιο απλά πράγματα, ιδανικά αγόρασε ένα Αγγλικό βιβλίο με ασκήσεις και ξεκίνα το βήμα-βήμα (όχι όμως το "The C Programming Language" των Κ&R). ΥΓ. Το calc πως το έχεις κάνει αλήθεια; Πιθανολογώ με κλασικά switch statements. Αν ναι, δοκίμασε να το αναβαθμίσεις φτιάχνοντάς το με στοίβες (stacks) και ουρές (queues), για να μετατρέπεις το input από infix notation σε reverse polish notation για να υπολογίζεις τις πράξεις και τις προτεραιότητες. Γκούγκλάρε τα bold, αν δεν ξέρεις τι είναι. Θα σε κρατήσει απασχολημένο για 1-2-3-4 μήνες Ή κάτι άλλο, αν θες να εξοικειωθείς με το file system. Από τις κλασικές ασκήσεις είναι να φτιάξεις δικιά σου υλοποίηση της εντολής: ls
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα