Not logged in. · Lost password · Register
Forum: Grundstudium 2. Semester Informatik (GDI II) SPiC RSS
2b April 2009
Dani #1 -- for 2 months · 8 posts
Show profile · Link to this post
Subject: 2b April 2009
Hi,
hab hier mal die Aufgabe 2b vom April 2009 bearbeitet.
Es handelt sich hierbei um die Ausgabe von Größe und Name aller Files eines Verzeichnisses.
Vielleicht könnte mal jemand drüber schauen und auf fehler überprüfen.
Insbesondere Ausgabe der Größe.
Vielen Dank
lg Dani =)

  1. int main(int argc, char *argv[])
  2. {
  3.     DIR *dirp;
  4.     struct dirent *entry;
  5.    
  6.     // Fehlerabfrage auf Argumentenanzahl (2)
  7.     if(argc != 2)
  8.     {
  9.         fprintf(stderr, "Argument counter failed\n"); // Ausgabe auf StandardErrorKanel
  10.         exit(EXIT_FAILURE);
  11.     }
  12.    
  13.     dirp = opendir(argv[1]); // Open dir übergebener Pfad
  14.    
  15.     if(dirp == NULL)
  16.     {
  17.         fprintf(stderr, "Fehler beim Oeffnen\n");
  18.         exit(EXIT_FAILURE);
  19.     }
  20.    
  21.     while(errno == 0, entry = readdir(dirp)) // Beenden bei error oder bei Ende der Files
  22.     {
  23.         if(entry->d_name[0] != '.')
  24.         {
  25.             fprintf(stdout, "%s\n", entry->off_t); // ist off_t die richtige Eigenschaft für die Größe ?? Oder welche nimmt man!
  26.             fprintf(stdout, "%s\n", entry->d_Name);
  27.         }
  28.     }
  29.    
  30.     // Fehlerabfrage auf Errno
  31.     if(errno != 0)
  32.     {
  33.         fprintf(stderr, "Fehler innerhalb readdir\n");
  34.         exit(EXIT_FAILURE);
  35.     }
  36.    
  37.     return 1;
  38. }
Raim #2 -- User title: SPiC-Übungsleiter · for 2 months · 2 posts
Show profile · Link to this post
Eigentlich handelt es sich hierbei fast um die identische Aufgabe wie die printdir und das Vorgehen sollte daher bekannt sein.

Fehlermeldungen sollten aussagekräftig sein und alle verfügbaren Informationen enthalten. Das ist bei dir hier so gut wie nie der Fall. Das heißt man sollte immer die errno auswerten, wenn eine Bibliotheksfunktion fehlschlägt:
fprintf(stderr, "foo: %s\n", strerror(errno));
/* ODER */
perror("foo")

Es gibt hier ein Problem mit den Pfadangaben. In ent->d_name steckt nur der Dateiname selbst, nicht die komplette Pfadangabe. Daher muss man für den Aufruf von stat() entweder den Pfad konkatenieren oder aber einfacher in das entsprechende Verzeichnis wechseln, in dem dann nur die Dateinamen als relative Pfadangaben korrekt sind. Hier fehlt also ein chdir(argv[1]); (+Fehlerbehandlung) vor der readdir-Schleife.

Die Größe einer Datei ermittelt man mit dem Systemaufruf stat(). Siehe Folien zur Übung 6.

Ein fehlerfrei durchgelaufenes Programm sollte sich am Ende der main mit return 0; beenden, nur bei Fehlern ungleich 0.
Dani #3 -- for 2 months · 8 posts
Show profile · Link to this post
Hab jetzt das Programm überarbeitet.
Hoffe das passt jetzt so.
Ich habe nur zu dem chdir() nichts in den Folien gefunden und bin deshalb etwas irritiert.
Entweder ich habs übersehen oder es muss eine andere Möglichkeit geben.
Ist es auch möglich
stat(argv[2], &buffer);
zu machen ohne das Verzeichnis zu wechseln?

  1. int main (int argc, char * argv){
  2.     DIR *dirp;
  3.     struct dirent *entry;
  4.     if (argc != 2){
  5.         fprintf(sdterr,"foo: %s\n", strerror(errno));
  6.         exit(EXIT_FAILURE);
  7.     }
  8.     dirp = opendir(argv[1]);
  9.     if (dirp == NULL){
  10.         fprintf(sdterr,"foo: %s\n, strerror(errno));
  11.         exit(EXIT_FAILURE);
  12.     }
  13.     if(chdir(argv[1])== -1){                               
  14.         fprintf(sdterr,"foo: %s\n, strerror(errno));
  15.         exit(EXIT_FAILURE);
  16.     }
  17.     while(errno == 0, entry = readdir(dirp)){
  18.         if(entry->d_name [0]!='.'){
  19.             struct stat buffer;
  20.             if(stat(entry->d_name, &buffer)==-1){      
  21.                 fprintf(sdterr,"foo: %s\n, strerror(errno));
  22.                 exit(EXIT_FAILURE);
  23.             }
  24.             fprintf(sdtout, "%s\n", buffer.st_size);           
  25.             fprintf(sdtout, "%s\n, entry-> d_name);
  26.             }
  27.         }
  28.     if (errno !=0){
  29.         fprintf(sdterr,"foo: %s\n, strerror(errno));
  30.         exit(EXIT_FAILURE);
  31.     }
  32.     return 0;
  33. }
This post was edited on 2010-07-29, 15:40 by Dani.
morty (Administrator) #4 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
  • Da fehlen noch ein paar " bei deinen Strings.
  • Du öffnest zwar mit opendir das entsprechende Verzeichnis, aber in d_name steht natürlich nur der reine Dateiname. Wenn du dann ein stat machst, dann sucht das stat im aktuellen Arbeitsverzeichnis (in welchem dein Programm gestartet wurde), findet die Datei nicht und schlägt fehl.
-> chdir ist aber nicht weiter schwer. Du übergibst dem einfach das neue Arbeitsverzeichnis. Ab jetzt ist das dann dein Arbeitsverzeichnis.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Unclassified NewsBoard 1.6.4 © 2003-5 by Yves Goergen
Page created in 510.8 ms (303.6 ms) · 63 database queries in 61.6 ms
Current time: 2010-09-10, 04:08:44 (UTC +02:00)