当前位置: 首页 > news >正文

【C语言】C语言文件操作指南

目录

  • C语言文件操作指南
    • 1. 文件打开与关闭
      • 1.1 fopen() 模式参数详解
      • 1.2 fclose() 返回值说明
    • 2. 文件读写位置控制
      • 2.1 定位函数对比
    • 3. 字符级文件操作
      • 3.1 fgetc() / fputc() 参数说明
    • 4. 行级文件操作
      • 4.1 fgets() 参数详解
    • 5. 格式化文件操作
      • 5.1 fprintf() 格式说明符
    • 6. 块级文件操作
      • 6.1 fread() / fwrite() 参数解析
    • 7. 文件状态与元数据
      • 7.1 stat 结构体关键字段
    • 8. 其他实用函数
      • 8.1 文件管理函数对比
    • 9. 最佳实践总结
      • 9.1 文件操作黄金法则
      • 9.2 错误处理规范
      • 9.3 性能优化策略

C语言文件操作指南


1. 文件打开与关闭

1.1 fopen() 模式参数详解

模式字符串描述文件存在文件不存在
“r” / “rb”只读模式打开失败
“w” / “wb”写入模式(清空内容)清空创建
“a” / “ab”追加模式追加创建
“r+”可读可写(不截断)打开失败
“w+”可读可写(清空内容)清空创建
“a+”可读可追加(写入时自动定位到文件末尾)打开创建

安全打开示例

FILE *fp = fopen("data.dat", "rb+");
if (NULL == fp) {
    perror("文件打开失败");
    exit(EXIT_FAILURE);
}

1.2 fclose() 返回值说明

返回值含义处理建议
0关闭成功无需处理
EOF关闭失败检查文件是否被其他进程占用

2. 文件读写位置控制

2.1 定位函数对比

函数功能典型应用场景注意事项
ftell()获取当前文件位置记录断点位置返回值类型为long
fseek()设置文件位置随机访问文件二进制/文本模式行为不同
rewind()重置到文件开头重新读取文件等价于fseek(fp, 0, SEEK_SET)

文件大小获取技巧

long get_file_size(FILE *fp) {
    fseek(fp, 0L, SEEK_END);
    long size = ftell(fp);
    rewind(fp);
    return size;
}

3. 字符级文件操作

3.1 fgetc() / fputc() 参数说明

函数参数类型返回值典型错误值
fgetc()FILE*读取的字符(0-255)EOF(-1)
fputc()int, FILE*写入的字符EOF

安全拷贝示例

int ch;
while ((ch = fgetc(src)) != EOF) {
    if (fputc(ch, dest) == EOF) {
        perror("写入失败");
        break;
    }
}

4. 行级文件操作

4.1 fgets() 参数详解

参数作用注意事项
str存储读取内容的缓冲区必须预先分配内存
size缓冲区大小包含终止符的空间
stream文件指针需确保已正确打开

安全读取示例

char buffer[256];
while (fgets(buffer, sizeof(buffer), fp)) {
    buffer[strcspn(buffer, "\n")] = '\0'; // 去除换行符
    // 处理逻辑
}

5. 格式化文件操作

5.1 fprintf() 格式说明符

格式符类型示例
%dintfprintf(fp, “%d”, 42)
%ffloat/doublefprintf(fp, “%.2f”, 3.1415)
%s字符串fprintf(fp, “%s”, “Hello”)
%p指针地址fprintf(fp, “%p”, ptr)

结构化数据存储

typedef struct {
    int id;
    char name[20];
    float score;
} Student;

Student s = {101, "Alice", 95.5};
fprintf(fp, "%04d|%-20s|%05.2f\n", s.id, s.name, s.score);

6. 块级文件操作

6.1 fread() / fwrite() 参数解析

参数说明典型用法
ptr数据缓冲区地址结构体指针/数组首地址
size单个元素字节数sizeof(DataType)
nmemb元素数量数组长度
stream文件指针需以二进制模式打开

二进制数据存储示例

#define MAX_ITEMS 100
typedef struct {
    int id;
    char name[30];
    double price;
} Product;

Product inventory[MAX_ITEMS];
size_t items_written = fwrite(inventory, sizeof(Product), MAX_ITEMS, fp);

7. 文件状态与元数据

7.1 stat 结构体关键字段

字段类型描述
st_sizeoff_t文件大小(字节)
st_modemode_t文件类型和权限
st_mtimetime_t最后修改时间
st_uiduid_t所有者用户ID
st_gidgid_t所有者组ID

文件类型判断宏

S_ISREG(st.st_mode)  // 常规文件
S_ISDIR(st.st_mode)  // 目录
S_ISCHR(st.st_mode)  // 字符设备

8. 其他实用函数

8.1 文件管理函数对比

函数功能返回值跨平台性
remove()删除文件0成功,-1失败通用
rename()重命名/移动文件0成功,-1失败路径规则不同
tmpfile()创建临时文件FILE指针/NULLC标准保证

9. 最佳实践总结

9.1 文件操作黄金法则

  1. 始终检查返回值:所有文件操作函数都应检查返回值
  2. 明确打开模式:根据需求选择正确的模式字符串
  3. 二进制优先原则:处理非文本数据时使用"b"模式
  4. 及时关闭文件:使用后立即关闭释放资源
  5. 缓冲区管理:合理设置缓冲区大小(推荐4K对齐)

9.2 错误处理规范

FILE *fp = fopen("data.dat", "rb");
if (NULL == fp) {
    fprintf(stderr, "[错误代码 %d] %s: %s\n", 
            errno, strerror(errno), "data.dat");
    exit(EXIT_FAILURE);
}

if (fclose(fp) == EOF) {
    perror("文件关闭失败");
}

9.3 性能优化策略

策略适用场景效果
批量读写(fread/fwrite)大数据量处理减少系统调用次数
内存映射超大文件随机访问避免多次I/O操作
缓冲区设置高频小数据操作减少物理写入次数

最后提醒

文件操作是系统编程的基础,遵循以下原则可避免常见问题:

  • 使用绝对路径时注意平台差异(Windows/Linux)
  • 处理用户输入路径时进行规范化
  • 敏感文件操作添加权限检查
  • 长期运行程序定期刷新缓冲区(fflush())
http://www.dtcms.com/a/109086.html

相关文章:

  • 质检LIMS系统在垃圾处理厂的应用 垃圾处理质检的三重挑战与LIMS破局之道
  • 管理系统如何帮助你节省时间和成本?
  • 移动端六大语言速记:第7部分 - 文件与输入输出(I/O)
  • 【网络流 图论建模 最大权闭合子图】 [六省联考 2017] 寿司餐厅
  • 二十八、城市建成区提取——领域分析法
  • vulnhub-DC-2通关攻略
  • 从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.2.1模型偏见与安全对齐(Red Teaming实践)
  • 新能源汽车测试中的信号调理模块:从原理到实战应用
  • python--文件夹的压缩和解压缩(zipfile/pyzipper)
  • Day15——路由
  • 飞浆PaddlePaddle 猫狗数据大战
  • Pyinstaller 打包flask_socketio为exe程序后出现:ValueError: Invalid async_mode specified
  • 学习threejs,使用Texture纹理贴图,测试repeat重复纹理贴图
  • ngx_regex_init
  • C语言基础要素(019):输出ASCII码表
  • 李沐 X 动手学深度学习--第九章 现代循环神经网络
  • webstorm初始化配置项目
  • MySQL学习集--DDL
  • Python 数据科学实战指南:从零开始构建高效分析流程
  • 单片机学习之SPI
  • JVM深入原理(七)(一):运行时数据区
  • 图形界面设计理念
  • 使用 PyTorch 的 `optim.lr_scheduler.CosineAnnealingLR` 学习率调度器
  • 蓝桥云客-修建灌木
  • Ubuntu环境基于Ollama部署DeepSeek+Open-Webui实现本地部署大模型-无脑部署
  • 静态库和动态库
  • 数据结构复习(单调栈,单调队列,KMP,manacher,tire,字符串哈希)
  • HTML 音频(Audio)学习笔记
  • 时间数据的可视化
  • 什么是msvcp140.dll?msvcp140.dll丢失的解决方法又有哪些?