Nicht angemeldet. · Kennwort vergessen · Registrieren

5er
Mitglied seit 04/2011
5 Beiträge
Betreff: Printf-März2010
Und nochmal was.
Kommentare und korrektur erwüncht ;)

  1. /*
  2. * printf.c
  3. *
  4. *  Created on: 29.07.2011
  5. *      Author: Manuel
  6. */
  7.  
  8. int main (int argc,char *argv []){
  9.     static DIR *ordner;
  10.     static struct dirrent *dir;
  11.     static struct stat attribute;
  12.     static uint16_t size;
  13.     static uint8_t raeg, nraeg;
  14.  
  15.  
  16.     if(argc!=2){
  17.         perror("falsche Argumentenzahl");
  18.         exit(EXIT_FAILURE);
  19.  
  20.     }
  21.     if(chdir(argv[1]==-1)){
  22.         perror("chdir");
  23.         exit(EXIT_FAILURE);
  24.     }
  25.  
  26.     ordner=opendir(".");
  27.     if(ordner==NULL){
  28.         perror("opendir");
  29.         exit(EXIT_FAILURE);
  30.     }
  31.  
  32.     while(errno=0,dir=readdir(ordner)!=NULL){
  33.         if(*(dir->d_name=='.')){
  34.             continue;
  35.         }
  36.         if(stat(dir->d_name,&attribute)==-1){
  37.             perror("stat");
  38.             exit(EXIT_FAILURE);
  39.         }
  40.         if(S_ISREG(attribute.st_mode)==1){
  41.             raeg++;
  42.             size*=attribute.st_size;
  43.         }else(nraeg++);
  44.  
  45.         printf("Directory%s :",argv[1]);
  46.         printf("%d reguläre DAteien,%d sonstige Dateien,Gesamtspeicherbedarf %d",raeg,nraeg,size);
  47.     }if(errno!=NULL){
  48.         perror("(readdir");
  49.         exit(EXIT_FAILURE);
  50.     }
  51.  
  52.  
  53.     printf("Directory%s :",argv[1]);
  54.     printf("%d reguläre DAteien,%d sonstige Dateien,Gesamtspeicherbedarf %d",raeg,nraeg,size);
  55.  
  56. }
Dieser Beitrag wurde am 29.07.2011, 17:31 von 5er verändert.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Hab mal die header reingeschmissen und bekomme (die Zeilennummern stimmen):

gcc -std=c99 -pedantic -Wall   test.c
test.c: In function ‘main’:
test.c:21: warning: comparison between pointer and integer
test.c:21: warning: passing argument 1 of ‘chdir’ makes pointer from integer without a cast
/usr/include/unistd.h:493: note: expected ‘const char *’ but argument is of type ‘int’
test.c:21: warning: null argument where non-null required (argument 1)
test.c:32: warning: assignment makes pointer from integer without a cast
test.c:33: error: dereferencing pointer to incomplete type
test.c:36: error: dereferencing pointer to incomplete type
test.c:47: warning: comparison between pointer and integer

Außerdem: Wieso sind die ganzen variablen static?
5er
Mitglied seit 04/2011
5 Beiträge
Erstmal Danke fürs anschauen.
Muss mich erstmal entschuldigen, hab total verplant das ich die Aufgabe ganz normal Compilieren hätte können.  :rolleyes:
 
Ich hab irgendwie falsch gedacht und habe die Variablen wie globale Variablen behandelt. Was natürlich quatsch ist.
Die Fehler die er angezeigt hat, waren alle Fehler beim Abschreiben wie Kommasetzung oder dirent mit zwei r usw.
Jetzt die hoffentlich richtigere Version.
  1. /*
  2. * printf.c
  3. *
  4. *  Created on: 29.07.2011
  5. *      Author: Manuel
  6. */
  7.  
  8. #define _GNU_SOURCE
  9. #include <stdio.h>
  10. #include <sys/types.h>
  11. #include <errno.h>
  12. #include <dirent.h>
  13. #include <sys/param.h>
  14. #include <unistd.h>
  15. #include <sys/stat.h>
  16. #include <stdlib.h>
  17. #include <stdint.h>
  18.  
  19. int main (int argc,char *argv []){
  20.     DIR *ordner;
  21.     struct dirent *dir;
  22.     struct stat attribute;
  23.     uint16_t size;
  24.     uint8_t raeg;
  25.     uint8_t nraeg;
  26.  
  27.  
  28.     if(argc!=2){
  29.         perror("falsche Argumentenzahl");
  30.         exit(EXIT_FAILURE);
  31.  
  32.     }
  33.     if(chdir(argv[1])==-1){
  34.         perror("chdir");
  35.         exit(EXIT_FAILURE);
  36.     }
  37.  
  38.     ordner=opendir(".");
  39.     if(ordner==NULL){
  40.         perror("opendir");
  41.         exit(EXIT_FAILURE);
  42.     }
  43.  
  44.     while(errno=0,dir=readdir(ordner)){
  45.         if(*(dir->d_name)=='.'){
  46.             continue;
  47.         }
  48.         if(stat(dir->d_name,&attribute)==-1){
  49.             perror("stat");
  50.             exit(EXIT_FAILURE);
  51.         }
  52.         if(S_ISREG(attribute.st_mode)==1){
  53.             raeg++;
  54.             size+=attribute.st_size;
  55.         }else{
  56.                         nraeg++;
  57.                 }
  58.  
  59.         }if(errno!=0){
  60.         perror("(readdir");
  61.         exit(EXIT_FAILURE);
  62.     }
  63.  
  64.  
  65.     printf("Directory%s :\n",argv[1]);
  66.     printf("%d reguläre Dateien,%d sonstige Dateien,Gesamtspeicherbedarf %d\n",raeg,nraeg,size);
  67.  
  68. }
Dieser Beitrag wurde 2 mal verändert, zuletzt am 30.07.2011, 16:07 von 5er.
sicherha
Informatik-Veteran
Mitglied seit 10/2010
53 Beiträge
Vier Anmerkungen:
  • Es ist unnötig, erst das angegebene Verzeichnis zum aktuellen Verzeichnis zu machen (chdir()) und das dann zu öffnen. Stattdessen könntest du gleich opendir() auf den übergebenen Pfad aufrufen.
  • Die Fehlerbehandlung fürs readdir() (Zeile 59 ff.) muss hinter die while-Schleife. Im Schleifenrumpf landet man ja nur dann, wenn der Aufruf erfolgreich war. Kommando zurück, es steht ja hinter der Schleife! Das sieht nur wegen der kaputten Einrückung falsch aus.
  • Ich vermisse das Schließen des Verzeichnisses.
  • Die Datentypen für die Zählvariablen sind viel zu klein gewählt. Ein Verzeichnis kann weit mehr als 255 Einträge enthalten und die können in der Summe weit mehr als 64 KiB groß sein.
Dieser Beitrag wurde am 30.07.2011, 19:35 von sicherha verändert.
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen