Fragen zu stat und st_size



  • Guten Abend,

    beim nachprogrammieren meiner Literaturbeispiele aus "C von A bis Z" (Galileo Verlag) verstehe ich nicht, was es mit "stat" auf sich hat und dies wird dort auch nicht weiter erläutert.

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys\stat.h>
    
    int main(int argc, char *argv[]) {
       struct stat attribut;
       unsigned long sizeofall=0;
    
             printf("Größe von %s = %ld Bytes\n",
                *argv,attribut.st_size);
             return EXIT_SUCCESS;
    }
    

    Falls mir jmd. erklären könnte, wie es kommt, dass die Struktur "attribut" nie etwas von den übergebenen Parametern erfährt und dennoch richtig die Filelänge ermittelt wird! Wie geht das?
    Und wie könnte ich dies in einem anderen Zusammenhang benutzen? Eine bestehende Struktur anwenden?

    Danke, Bilou!



  • http://www.imb-jena.de/~gmueller/kurse/c_c++/c_file.html

    Hier wird alles nötige erklärt.
    Gruss Binggi



  • Kann es sein, dass du nicht eins zu eins den Code kopiert hast? Kurze Recherche ergab http://openbook.galileocomputing.de/c_von_a_bis_z/017_c_dateien_verzeichnisse_001.htm#t2t33 und da wird wie erwartet auch stat() aufgerufen welches die Struktur füllt.



  • Ich häng dann meine Frage gleich mal hier mit ran:

    Was mache ich, wenn meine Datei ziemich groß ist (also ich mein so 4GB aufwärts)? Da erreiche ich doch die Grenze jeden Datentyps oder?



  • Dann nimmst du einfach stat64. (ab 2GB, laut Link, Erklärung im 2. Link)

    http://www.mkssoftware.com/docs/man5/struct_stat.5.asp

    http://www.cplusplus.com/forum/beginner/18238/



  • Das bekommst du plattformunabhängig nicht mehr hin, du musst zu Compiler/Bibliotheksspezifischem greifen.
    Für MSVC > 6.0 gibt es z.B. _stati64, dann müsstest du auch mit _int64 bzw. long long Integertypen weitermachen.



  • Danke schonmal. Jetzt hab ich leider folgende Fehlermeldung:

    storage size of 'attribut' isn't known|
    

    Benutze Code::Blocks und hab folgendes eingebunden:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    

    Und was genau passiert dabei auf 32bit Systemen? Einwandfrei kompatibel?





  • Vorherigen Fehler behoben. Bei GCC heißt die Funktion "_stati64". Die richtige Dateigröße zeigt er mir bei großen dateien immernoch nicht an.

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int main()
    {
        FILE *datei;
    
        datei=fopen("Pfad", "r"); //ja, für Pfad hab ich einen wirklichen Pfad angegeben
    
        struct _stati64 attribut;
        _stati64("Pfad",&attribut);
        unsigned long long groesse=0;
        groesse = attribut.st_size;
        printf("groesse: %llu", groesse);
    }
    


  • #ifdef __unix__
          #include <sys/stat.h>
    #else
          #include <sys\stat.h>
    #endif
    

    Dieses C von A bis Z ist doch immer wieder für einen Lacher gut.

    Aus

    /* size.c - Originalversion */
    #include <stdio.h>
    #include <stdlib.h>
    #ifdef __unix__
          #include <sys/stat.h>
          #include <sys/types.h>
    #else
          #include <sys\stat.h>
    #endif
    
    int main(int argc, char *argv[]) {
       struct stat attribut; // Schöne Eindeutschung (engl.: attribute)
       unsigned long sizeofall=0;
    
       if(argc == 1) {
          if(stat(*argv, &attribut) == -1) {
             fprintf(stderr,"Fehler bei stat....\n"); // Weiss der, dass perror den echten Grund anzeigt?
             return EXIT_FAILURE;
          }
          else {
             printf("Größe von %s = %ld Bytes\n",
                *argv,attribut.st_size);
             return EXIT_SUCCESS;
          }
       }
       else {
          while(*++argv) { // hier folgt Codeverdopplung
             if(stat(*argv, &attribut) == -1) {
                fprintf(stderr,"Fehler bei stat....\n");
                return EXIT_FAILURE;
             }
             else {
                printf("Größe von %s = %ld Bytes\n",
                   *argv,attribut.st_size);
                sizeofall += attribut.st_size;
             }
          }
       }
       printf("Größe aller Dateien in der "
              " Kommandozeile = %ld Bytes",sizeofall); // Grösse aller Dateien in der Kommandozeile?!?
       printf("= %ld KB\n",sizeofall/=1024); // hihi: sizeofall/=1024
       return EXIT_SUCCESS;
    }
    

    mach

    /* size.c - Verbesserte Version */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    
    int main (int argc, char *argv[])
    {
      struct stat status;
      off_t size_total = 0;
    
      for (argv+=!!(argc-1); *argv; ++argv) {
        if (stat (*argv, &status) == -1) {
          perror("Fehler bei stat");
          return EXIT_FAILURE;
        }
        printf ("Größe von %s: %ld Bytes\n", *argv, status.st_size);
        size_total += status.st_size;
      }
      if (argc > 1)
        printf ("Größe aller angegebenen Dateien: %ld Bytes = %ld KiB\n",
    	    size_total, size_total/1024);
      return EXIT_SUCCESS;
    }
    

    Ergibt zwar gleiche Funktionalität, aber die Sache mit argv[0] hat unser Jürgen Wolf noch nicht ganz verstanden.



  • Danke! Läuft jetzt alles soweit.



  • Das funktionier ja alles super 🙂
    Jedoch habe ich das Problem, dass wenn ich es mit einem Verzeichnis probiere nicht klappt. "& S_IFDIR" anzuhängen bringt auch nichts. Hätte da noch jemand eine Idee? 🙂


  • Mod

    halotolos schrieb:

    Hätte da noch jemand eine Idee? 🙂

    Keine Threadnekromantie betreiben, richtiges Forum wählen*, genaue Fragen stellen.

    *: Ja, dieser Thread hier ist selber falsch einsortiert.


Log in to reply