How do you determine the size of a file in C? How do you determine the size of a file in C? c c

How do you determine the size of a file in C?


Based on NilObject's code:

#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; }

Changes:

  • Made the filename argument a const char.
  • Corrected the struct stat definition, which was missing the variable name.
  • Returns -1 on error instead of 0, which would be ambiguous for an empty file. off_t is a signed type so this is possible.

If you want fsize() to print a message on error, you can use this:

#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;}

On 32-bit systems you should compile this with the option -D_FILE_OFFSET_BITS=64, otherwise off_t will only hold values up to 2 GB. See the "Using LFS" section of Large File Support in Linux for details.


Don't use int. Files over 2 gigabytes in size are common as dirt these days

Don't use unsigned int. Files over 4 gigabytes in size are common as some slightly-less-common dirt

IIRC the standard library defines off_t as an unsigned 64 bit integer, which is what everyone should be using. We can redefine that to be 128 bits in a few years when we start having 16 exabyte files hanging around.

If you're on windows, you should use GetFileSizeEx - it actually uses a signed 64 bit integer, so they'll start hitting problems with 8 exabyte files. Foolish Microsoft! :-)


Matt's solution should work, except that it's C++ instead of C, and the initial tell shouldn't be necessary.

unsigned long fsize(char* file){    FILE * f = fopen(file, "r");    fseek(f, 0, SEEK_END);    unsigned long len = (unsigned long)ftell(f);    fclose(f);    return len;}

Fixed your brace for you, too. ;)

Update: This isn't really the best solution. It's limited to 4GB files on Windows and it's likely slower than just using a platform-specific call like GetFileSizeEx or stat64.