返回文件大小的函数?
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 */ };