Quoting the C99 standard doc that i found online: "Setting the file position indicator to end-of-file, as with fseek(file, 0, SEEK_END), has undefined behavior for a binary stream (because of possible trailing null characters) or for any stream with state-dependent encoding that does not assuredly end in the initial shift state.**
//opens a file with a file descriptor
FILE * i_file;
i_file = fopen(source, "r");
//gets a long from the file descriptor for fstat
long f_d = fileno(i_file);
struct stat buffer;
fstat(f_d, &buffer);
//stores file size
long file_length = buffer.st_size;
fclose(i_file);
13 个回复
qquas
赞同来自:
您将需要使用库函数来检索文件的详细信息。由于C完全独立于平台,因此您需要告诉我们您开发的平台/操作系统是什么!
oqui
赞同来自:
如果你使用std c库很好:
punde
赞同来自:
您可以打开该文件,使用相对于文件底部的0偏移量
从fseek返回的值是文件的大小。 我很久没有用C语言编码了,但我认为它应该可以工作。fearum
赞同来自:
马特的解决方案应该工作,除了它是C++而不是C,并且初始告诉不应该是必需的。
固定你的支架也是。 ;) 更新:这不是最好的解决方案。它仅限于Windows上的4GB文件,并且可能比仅使用平台特定的调用(如GetFileSizeEx
或stat64
)要慢。wfuga
赞同来自:
**不要这样做(why?):
将定义更改为int,以便可以传输错误消息,然后使用fseek()和ftell()来确定文件大小。nquae
赞同来自:
Google中的快速搜索找到了a method using fseek and ftell和一个包含这个问题的线索,并且以另一种方式在C中无法完成。 您可以使用像NSPR(支持Firefox的库)的可移植性库,或者检查its implementation(相当多毛)。
nerror
赞同来自:
请勿使用
int
。这些日子以来,大小超过2GB的文件常常被视为污点 请勿使用unsigned int
。大小超过4GB的文件是常见的一些常见的污点 IIRC标准库将off_t
定义为无符号的64位整数,这是每个人都应该使用的。我们可以在几年内将16位exabyte文件挂起时重新定义为128位。 如果你在windows上,你应该使用GetFileSizeEx - 它实际上使用了一个有符号的64位整数,所以他们会开始用8个exabyte文件来解决问题。愚蠢的微软! :-)funde
赞同来自:
如果您正在构建Windows应用程序,请使用GetFileSizeEx API,因为CRT文件I/O很混乱,尤其是在确定文件长度时,由于不同系统上文件表示的特性;)
in_ut
赞同来自:
基于NilObject的代码:
变化:const char
。struct stat
定义。-1
而不是0
,这对于一个空文件是不明确的。off_t
是一种有符号的类型,所以这是可能的。fsize()
错误地显示消息,则可以使用以下命令:-D_FILE_OFFSET_BITS=64
选项对其进行编译,否则off_t
只能保存高达2 GB的值。有关详细信息,请参阅Large File Support in Linux的“使用LFS”部分。ad_est
赞同来自:
我使用这组代码来查找文件长度。
zquia
赞同来自:
看看这个问题,
ftell
可以很容易地得到字节数。ased
赞同来自:
这是一个简单而干净的函数,它返回文件大小。
yeum
赞同来自:
尝试这个 -
这是做什么的,首先,寻求文件的结尾;然后,报告文件指针的位置。最后(这是可选的)它回退到文件的开头。请注意,fp
应该是一个二进制流。 file_size包含文件包含的字节数。请注意,由于(根据climits.h),无符号long类型被限制为4294967295个字节(4千兆字节),如果您可能要处理大于该文件的文件,则需要找到其他变量类型。