C语言文件操作:获取文件大小、读取及写入内容封装

Oliver
Oliver
发布时间:2026-10-14| 4人浏览过
原创

在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 函数

目的:一次性读取整个文件内容到内存中。
入口:文件路径字符串。
动作:

  1. 使用 fopen 打开文件,失败则提示错误并退出。
  2. 调用前述 filesize 函数获取文件大小。
  3. 使用 malloc 动态分配足够大的字符数组缓冲区。
  4. 使用 memset 初始化缓冲区为空字符。
  5. 重置文件指针到开头 (fseek(..., SEEK_SET)),然后使用 fgets 逐行(块)读取文件,并用 strcat 追加到缓冲区。
  6. 关闭文件,返回缓冲区指针。

注意:由于使用的是动态内存分配,调用方在使用完返回值后必须调用 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语言文件操作技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。