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

#include <stdio.h>

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

推荐答案

On Unix-like systems, you can use POSIX system calls: stat on a path, or fstat on an already-open file descriptor (POSIX man page, Linux man page).
(Get a file descriptor from open(2), or fileno(FILE*) on a stdio stream).

基于NilObject的代码:

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

更改:

  • 将文件名参数设为const char.
  • 更正了缺少变量名的struct stat定义.
  • 出错时返回-1,而不是0,这对于空文件来说是不明确的.off_t是带符号的类型,因此这是可能的.

如果希望fsize()打印错误消息,可以使用以下选项:

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

在32位系统上,您应该使用选项-D_FILE_OFFSET_BITS=64来编译它,否则off_t将只能保存最大为2GB的值.详见Large File Support in Linux页的"使用LFS"一节.

C++相关问答推荐

理解没有返回语句的递归C函数的行为

Mise()在虚拟内存中做什么?

为什么C语言允许你使用var =(struct NAME){

在我的代码中,我需要在哪里编写输出函数?

平均程序编译,但结果不好

S将C语言宏定义为自身的目的是什么?(在glibc标题中看到)

为什么指针运算会产生错误的结果?

为什么未初始化的 struct 的数组从另一个数组获取值?

是否定义了此函数的行为?

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

为什么编译器不能简单地将数据从EDI转移到EAX?

如何读取程序中嵌入的数据S自己的ELF?

使用正则表达式获取字符串中标记的开始和结束

发送和接收的消息中的Unix域套接字不匹配

浮动目标文件,数据段

从Raku nativecall调用时精度不同

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

C程序printf在getchar while循环后不工作

快速准确计算double的小数指数

在 C 中的 scanf() 格式说明符中使用宏获取字符串长度