C语言文件操作:获取文件大小、读取及写入内容封装
在C语言开发中,处理文件是基础且高频的需求。本文分享一套封装好的C语言文件操作工具函数,实现了类似于其他语言中 file_get_contents 和 file_put_contents 的功能,同时包含获取文件大小的方法。这些函数基于ANSI C标准库编写,旨在简化文本文件的读取与写入流程。
核心功能说明
为了实现便捷的 file 操作,我们主要定义并实现了以下三个函数:
- long filesize(char* filename):以二进制模式打开文件,移动文件指针至末尾,通过
ftell返回文件的总字节数。若文件不存在或无法打开,返回 0。 - char* file_get_contents(char* filename):读取指定文件的全部文本内容。它会先获取文件大小,动态分配内存缓冲区,然后循环读取并将内容拼接返回。注意调用者需负责释放返回的指针内存。
- void file_put_contents(char* filename, char* data):将提供的字符串数据写入指定文件。采用
w+模式打开,清空原有内容后写入新数据。
完整源代码实现
以下为包含上述三个核心函数及 main 测试入口的完整C语言代码。代码使用了 <stdio.h>, <stdlib.h> 和 <string.h> 头文件。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 函数声明
long filesize(char* filename);
char* file_get_contents(char* filename);
void file_put_contents(char* filename, char* data);
int main() {
printf("%s\n", "----------------Begin---------------");
// 定义测试文件名
char* filename = "/tmp/tmp.txt";
// 1. 写入内容
file_put_contents(filename, "https://www.jb51.net");
// 2. 读取内容
char* data = file_get_contents(filename);
if (data != NULL) {
printf("Fd:: %s\n", data);
free(data); // 记得释放内存
}
// 3. 获取文件大小
long size = filesize(filename);
printf("File Size: %ld bytes\n", size);
printf("%s\n", "----------------End-----------------");
return 0;
}
// 获取文件大小
long filesize(char* filename) {
long length;
FILE* stream = fopen(filename, "rb");
if(!stream) return 0L;
fseek(stream, 0L, SEEK_END);
length = ftell(stream);
fclose(stream);
return length;
}
// 读取文件全部内容
char* file_get_contents(char* filename) {
FILE* fp = fopen(filename, "rb");
if(!fp) {
printf("%s\n", "The file can not be opened.");
exit(0);
}
long length = filesize(filename);
// 分配内存,注意实际读取时建议检查malloc是否成功
char* buffer = (char*) malloc(length + 1);
if (!buffer) { fclose(fp); return NULL; }
char buf[1024];
memset(buffer, 0x00, length + 1); // 初始化为0,防止乱码
fseek(fp, 0L, SEEK_SET);
// 循环读取直到文件结束
while(fgets(buf, 1024, fp) != NULL)
strcat(buffer, buf);
fclose(fp);
return buffer;
}
// 写入文件内容
void file_put_contents(char* filename, char* data) {
FILE* fp = fopen(filename, "w+");
if(!fp) {
printf("The file can not be opened.\n");
exit(1);
}
fputs(data, fp);
fclose(fp);
}
代码逻辑详解
第1步:实现 filesize 函数
目的:快速获取文件的字节长度,为后续读取所有数据做准备。
入口:文件路径字符串。
动作:使用 fopen(filename, "rb") 以只读二进制模式打开文件。利用 fseek(stream, 0L, SEEK_END) 将文件指针移到文件末尾,再调用 ftell(stream) 获取当前指针位置,即为文件总长度。最后关闭文件流。
参数:filename 为目标文件路径。
完成状态:返回一个 long 类型的整数,表示文件大小。
第2步:实现 file_get_contents 函数
目的:一次性读取整个文件内容到内存中。
入口:文件路径字符串。
动作:
- 使用
fopen打开文件,失败则提示错误并退出。 - 调用前述
filesize函数获取文件大小。 - 使用
malloc动态分配足够大的字符数组缓冲区。 - 使用
memset初始化缓冲区为空字符。 - 重置文件指针到开头 (
fseek(..., SEEK_SET)),然后使用fgets逐行(块)读取文件,并用strcat追加到缓冲区。 - 关闭文件,返回缓冲区指针。
注意:由于使用的是动态内存分配,调用方在使用完返回值后必须调用 free() 释放内存,否则会导致内存泄漏。
第3步:实现 file_put_contents 函数
目的:将指定字符串内容写入文件。
入口:文件路径、待写入的数据字符串。
动作:使用 fopen(filename, "w+") 打开文件。此模式允许读写,且如果文件存在则截断为零长度(即清空旧内容)。然后使用 fputs(data, fp) 将数据写入,最后关闭文件。
风险提醒:w+ 模式会覆盖原有文件内容,操作前请确认无需备份。
第4步:main 函数测试流程
目的:验证上述三个函数的协同工作。
动作:
1. 创建测试文件 /tmp/tmp.txt。
2. 调用 file_put_contents 写入示例网址。
3. 调用 file_get_contents 读取内容并打印。
4. (可选扩展)可在此处添加对 filesize 的调用验证长度是否正确。
使用与排错建议
内存管理:这是C语言文件操作的常见陷阱。file_get_contents 返回的是堆内存指针,务必在不再使用时调用 free()。如果在编译环境中忘记释放,程序长时间运行可能会消耗大量内存。
大文件处理:本示例适用于中小规模文本文件。如果文件大小超过可用内存,malloc 将会失败,导致程序崩溃或行为未定义。对于超大文件,建议采用分块读取策略,避免一次性加载。
编码问题:示例中使用的是纯ASCII/UTF-8兼容的文本操作。如果文件涉及多字节编码(如中文GBK),简单的 fgets 拼接可能在边界处出错,生产环境建议使用专门的宽字符函数或处理编码转换的工具库。
简要总结
以上便是C语言实现文件读写操作及获取文件大小的详细内容。通过封装 file_get_contents 和 file_put_contents,可以显著提升文件处理的开发效率。更多关于C语言文件操作技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









