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)
-
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?
-
Tim schrieb:
Kurze Recherche ergab http://openbook.galileocomputing.de/c_von_a_bis_z/017_c_dateien_verzeichnisse_001.htm#t2t33
Himmel hilf!
-
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?
-
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.