C语言设置文件长度的方法,可以在WIndows和Linux上用

本文介绍了一个跨平台的方法来设置文件的长度。在Windows平台上使用了_set_osfhandle 和 SetEndOfFile 函数,在非Windows平台上则利用 ftruncate 函数实现。此方法能够确保文件长度被正确设置。
bool setFileLength(FILE* file, unsigned int len)
{
#ifdef _WIN32
   fseek(file, len, SEEK_SET);
   int fd = _fileno(file);
   HANDLE hfile = (HANDLE)_get_osfhandle(fd);
   return SetEndOfFile(hfile);
#else
   int fd = fileno(file);
   return ftruncate(fd, len) == 0;
#endif
}

在 C 语言中,可以通过多种方式判断文件长度(即文件大小,单位为字节)。最常用的方法是使用标准库函数 `fseek()` `ftell()`,或者使用 POSIX 的 `stat()` 系统调用。 --- ## ✅ 方法一:使用 `fseek()` + `ftell()`(适用于标准 C) ```c #include <stdio.h> long get_file_size(const char *filename) { FILE *file = fopen(filename, "rb"); // 必须以二进制模式打开 if (!file) return -1; // 文件不存在或无法打开 fseek(file, 0L, SEEK_END); // 定位到文件末尾 long size = ftell(file); // 获取当前位置(即文件大小) fclose(file); return size; } // 使用示例 int main() { long size = get_file_size("/tmp/test.txt"); if (size >= 0) printf("文件大小: %ld 字节\n", size); else printf("文件打开失败!\n"); return 0; } ``` ### 🔍 原理说明: - `fopen(filename, "rb")`:以**二进制读模式**打开文件,避免文本模式下换行符被转换。 - `fseek(file, 0L, SEEK_END)`:将文件指针移动到末尾。 - `ftell(file)`:返回当前文件指针的位置(从开头起的偏移量),也就是文件总字节数。 - `fclose(file)`:关闭文件。 > ⚠️ 注意:`ftell()` 返回类型是 `long`,对于大文件(>2GB)可能溢出。可移植性更好的方法见下文。 --- ## ✅ 方法二:使用 `stat()` 系统调用(推荐用于 Linux/Unix) ```c #include <stdio.h> #include <sys/stat.h> off_t get_file_size_stat(const char *filename) { struct stat st; if (stat(filename, &st) == 0) { return st.st_size; // 文件大小(类型为 off_t) } return -1; // 出错或文件不存在 } // 使用示例 int main() { off_t size = get_file_size_stat("/tmp/test.txt"); if (size >= 0) printf("文件大小: %lld 字节\n", (long long)size); else printf("获取文件大小失败!\n"); return 0; } ``` ### 🔍 优点: - 不需要打开文件,效率更高; - 支持大文件(`off_t` 通常是 64 位); - 可同时获取权限、修改时间等信息。 ### 📌 包含头文件: ```c #include <sys/stat.h> ``` ### 💡 编译提示: 如果使用 `-std=c99` 或更严格的标准,可能需要定义 `_POSIX_C_SOURCE`: ```bash gcc -D_XOPEN_SOURCE=700 program.c -o program ``` --- ## ✅ 方法三:安全版本 —— 使用 `fseeko()` / `ftello()` 支持大文件文件大于 2GB 时,`ftell()` 的 `long` 类型可能不够用。应使用 `ftello()`,其返回类型为 `off_t`。 ```c #include <stdio.h> off_t get_file_size_large(const char *filename) { FILE *file = fopen(filename, "rb"); if (!file) return -1; fseeko(file, 0L, SEEK_END); // 使用 fseeko 支持大文件 off_t size = ftello(file); // 使用 ftello 获取 64 位大小 fclose(file); return size; } ``` > 需要启用 `_POSIX_C_SOURCE >= 200112L` 才能使用 `fseeko` / `ftello`。 --- ## ✅ 完整测试程序示例 ```c #include <stdio.h> #include <sys/stat.h> int main() { const char *filename = "/tmp/test.txt"; // 方法1:fseek + ftell FILE *f = fopen(filename, "rb"); if (f) { fseek(f, 0, SEEK_END); long size1 = ftell(f); fclose(f); printf("方法1 (ftell): %ld 字节\n", size1); } else { printf("无法打开文件:%s\n", filename); return 1; } // 方法2:stat struct stat st; if (stat(filename, &st) == 0) { printf("方法2 (stat): %lld 字节\n", (long long)st.st_size); } return 0; } ``` --- ## ❗注意事项总结 | 项目 | 说明 | |------|------| | **必须用 `"rb"` 模式** | 文本模式可能导致 `ftell()` 结果不准确 | | **大文件支持** | 使用 `ftello()` / `stat()` 而非 `ftell()` | | **跨平台兼容性** | Windows 上 `off_t` 可能是 32 位,建议用 `_stati64` | | **错误处理** | 所有函数都要检查返回值是否失败 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值