GOOGLE ADS

Montag, 25. April 2022

Wie bestimmt man die Größe einer Datei in C?

Wie kann ich die Größe einer Datei in Byte ermitteln?

#include <stdio.h>
unsigned int fsize(char* file){
//what goes here?
}


Lösung des Problems

Auf Unix-ähnlichen Systemen können Sie POSIX-Systemaufrufe verwenden: statauf einem Pfad oder fstatauf einem bereits geöffneten Dateideskriptor (POSIX- Manpage, Linux - Manpage ).
(Holen Sie sich einen Dateideskriptor von open(2), oder fileno(FILE*)in einem Stdio-Stream).

Basierend auf dem Code von NilObject:

#include <sys/stat.h>
#include <sys/types.h>
off_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}

Änderungen:


  • Das Dateinamen-Argument wurde zu einem const char.

  • Korrigierte die struct statDefinition, bei der der Variablenname fehlte.

  • Gibt -1bei einem Fehler anstelle von zurück 0, was für eine leere Datei mehrdeutig wäre. off_tist ein signierter Typ, daher ist dies möglich.


Wenn Sie fsize()bei einem Fehler eine Nachricht drucken möchten, können Sie Folgendes verwenden:

#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
off_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
fprintf(stderr, "Cannot determine size of %s: %s\n",
filename, strerror(errno));
return -1;
}

Auf 32-Bit-Systemen sollten Sie dies mit der Option kompilieren -D_FILE_OFFSET_BITS=64, da sonst off_tnur Werte bis 2 GB enthalten sind. Weitere Informationen finden Sie im Abschnitt „Using LFS" von Large File Support in Linux.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...