当前位置:  开发笔记 > 编程语言 > 正文

如何确定C中文件的大小?

如何解决《如何确定C中文件的大小?》经验,为你挑选了7个好方法。

如何计算文件的大小(以字节为单位)?

#include 

unsigned int fsize(char* file){
  //what goes here?
}

Ted Percival.. 137

基于NilObject的代码:

#include 
#include 

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

变化:

将文件名参数设为a const char.

更正了struct stat缺少变量名称的定义.

返回-1错误而不是0,这对于空文件来说是不明确的.off_t是签名类型,所以这是可能的.

如果要fsize()在出错时打印消息,可以使用以下命令:

#include 
#include 
#include 
#include 
#include 

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

在32位系统上,您应该使用该选项编译它-D_FILE_OFFSET_BITS=64,否则off_t只能保存最大2 GB的值.有关详细信息,请参阅Linux中的大文件支持的"使用LFS"部分.



1> Ted Percival..:

基于NilObject的代码:

#include 
#include 

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

变化:

将文件名参数设为a const char.

更正了struct stat缺少变量名称的定义.

返回-1错误而不是0,这对于空文件来说是不明确的.off_t是签名类型,所以这是可能的.

如果要fsize()在出错时打印消息,可以使用以下命令:

#include 
#include 
#include 
#include 
#include 

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

在32位系统上,您应该使用该选项编译它-D_FILE_OFFSET_BITS=64,否则off_t只能保存最大2 GB的值.有关详细信息,请参阅Linux中的大文件支持的"使用LFS"部分.


这是Linux/Unix特有的 - 可能值得指出,因为问题没有指定操作系统.
*对于更多可移植代码,请使用Derek建议的`fseek` +`ftell`.*No. [C标准](http://www.open-std.org/jtc1/sc22/wg14/www/docs/ n1256.pdf)明确指出二进制文件中的`fseek()`到`SEEK_END`是未定义的行为.**7.19.9.2`fseek`函数***...二进制流不需要有意义地支持`fseek`调用,其值为SEEK_END`*,如下所述,它来自p的脚注234.链接的C标准的267,并且特别将二进制流中的`fseek`标记为`SEEK_END`作为未定义的行为..

2> Orion Edward..:

不要用int.如今,超过2千兆字节的文件很常见

不要用unsigned int.超过4千兆字节的文件通常是一些略微不常见的污垢

IIRC标准库定义off_t为无符号64位整数,这是每个人都应该使用的.当我们开始有16个exabyte文件时,我们可以在几年内将其重新定义为128位.

如果你在Windows上,你应该使用GetFileSizeEx - 它实际上使用一个带符号的64位整数,因此它们将开始遇到8个exabyte文件的问题.愚蠢的微软!:-)



3> Derek Park..:

Matt的解决方案应该有效,除了它是C++而不是C,并且初始告诉不应该是必要的.

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

为你修好了你的支具.;)

更新:这不是最好的解决方案.这是仅限于在Windows 4GB的文件,它很可能比只使用一个特定于平台的调用,比如慢GetFileSizeExstat64.



4> andrewrk..:

**不要这样做(为什么?):

引用我在网上找到的C99标准文档:"将文件位置指示器设置为文件结尾,与fseek(文件,0,SEEK_END)一样,具有二进制流的未定义行为(因为可能是尾随空字符)或对于任何具有状态相关编码的流,它不能确定地在初始移位状态结束.**

将定义更改为int以便可以传输错误消息,然后使用fseek()和ftell()来确定文件大小.

int fsize(char* file) {
  int size;
  FILE* fh;

  fh = fopen(file, "rb"); //binary mode
  if(fh != NULL){
    if( fseek(fh, 0, SEEK_END) ){
      fclose(fh);
      return -1;
    }

    size = ftell(fh);
    fclose(fh);
    return size;
  }

  return -1; //error
}


@mezhaka:CERT报告完全错了.`fseeko`和`ftello`(或者`fseek`和`ftell`如果你没有前者而被困,并且对你可以使用的文件大小的限制感到满意)是确定文件长度的正确方法.基于`stat`的解决方案**在许多"文件"(例如块设备)上不起作用,并且不能移植到非POSIX-ish系统.

5> 小智..:
POSIX

POSIX标准都有自己的方法来获取文件的大小。
包括sys/stat.h标题以使用该功能。

概要

使用获取文件统计信息stat(3)

获取st_size属性。

例子

注意:大小限制为4GB。如果不是Fat32文件系统,则使用64位版本!

#include 
#include 

int main(int argc, char** argv)
{
    struct stat info;
    stat(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}
#include 
#include 

int main(int argc, char** argv)
{
    struct stat info;
    stat(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}
ANSI C(标准)

ANSI C不直接提供,以确定文件的长度的方式。
我们必须要动脑子。现在,我们将使用搜索方法!

概要

使用查找文件到最后fseek(3)

使用获取当前位置ftell(3)

#include 
#include 

int main(int argc, char** argv)
{
    struct stat64 info;
    stat64(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}

文件是stdin还是管道。POSIX,ANSI C无法正常工作。 如果文件是管道或
,它将返回。0stdin

意见:您应该改用POSIX标准。因为,它具有64位支持。



6> NilObject..:

如果您使用std c库很好:

#include 
off_t fsize(char *file) {
    struct stat filestat;
    if (stat(file, &filestat) == 0) {
        return filestat.st_size;
    }
    return 0;
}


这不是标准C.它是POSIX标准的一部分,但不是C标准.

7> 小智..:

而且,如果您要构建Windows应用程序,请使用GetFileSizeEx API,因为CRT文件的I / O杂乱无章,尤其是在确定文件长度时,由于不同系统上文件表示的特殊性;

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有