返回文件大小的函数?

int filesize(FILE * handle) { int filesize; int old_pointer = ftell(handle); fseek(handle, 0, SEEK_END); filesize = ftell(handle); fseek(handle, old_pointer, SEEK_SET); return filesize; } 

这是函数返回文件大小的好方法吗?

这是一种方法,只要您的文件不是太大(对于32位系统或Windows 64位,意味着不超过2 GiB)。 它具有或多或少在任何平台上工作的优点。 当然, ftell()返回一个long ,而不是一个int (所以在64位非Windows系统上,只要你正确修复代码,它可以报告的文件要大得多)。 但是,需要四个函数调用是非常昂贵的。

POSIX替代方案是stat()lstat()fstat()

Windows API中会有类似物。

我个人使用stat家族的function,就像这样。 另请注意, int对于返回值可能太小(特别是在32位系统上); off_t保证有效。

 off_t filesize(FILE *handle) { struct stat statbuf; if (fstat(fileno(handle), &statbuf) != 0) { // handle an error } else { return statbuf.st_size; } } 

另请注意,通过使用标准stat()而不是fstat() ,可以轻松调整此方法以适用于尚未打开的文件。

如果你在* nix上,你可以使用stat()fstat()

使用stat

 #include  int stat(const char *path, struct stat *buf); struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ ---> off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last status change */ };