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

文件操作核心概念总结

文章目录

      • 文件操作核心概念总结
        • 1. 基本概念
        • 2. 文件的打开
          • 2.1 函数原型与参数
          • 2.2 文件打开模式详解
        • 3. 文件的关闭
          • 3.1 函数原型
          • 3.2 关闭注意事项
        • 4. 错误处理与调试
          • 4.1 常见编译错误
          • 4.2 错误打印函数对比
        • 5. 关键注意事项
      • 总结流程图


注:手稿加DeepSeek总结!

文件操作核心概念总结

1. 基本概念
  • 打开文件:向系统申请资源(内存、文件描述符等),建立程序与文件的连接。
  • 关闭文件:释放资源,确保数据完整写入磁盘,避免内存泄漏。
  • 类比:文件操作类似借书→读书→还书流程。打开文件=借书(占用资源),关闭文件=还书(释放资源)。

2. 文件的打开
2.1 函数原型与参数
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
  • path
    • 当前目录文件:直接写文件名(如"data.txt"
    • 其他路径文件:需完整路径(如"/home/user/docs/data.txt"
  • mode
    • 决定文件访问方式(读、写、追加等)和文本/二进制模式(t/b,Linux可忽略)
2.2 文件打开模式详解
模式行为适用场景
r只读,文件必须存在读取配置文件、日志文件
w只写,清空文件或新建创建新日志、覆盖旧数据
a追加写,从文件末尾写入记录持续追加的数据(如监控)
r+读写,文件必须存在修改文件部分内容
w+读写,清空或新建文件需要频繁读写的新文件
a+读写,写操作始终追加读取并追加日志

示例1:基础文件操作

FILE *fp = fopen("data.txt", "r");  // 只读方式打开
if (fp == NULL) {
    perror("Error opening file");   // 输出错误原因(如文件不存在)
    exit(1);
}
// 读取或写入操作...
fclose(fp);  // 关闭文件

示例2:模式差异对比

// 场景:向已存在的test.txt写入"Hello"
FILE *fp1 = fopen("test.txt", "w"); // 原有内容被清空,只保留"Hello"
FILE *fp2 = fopen("test.txt", "a"); // "Hello"被追加到原内容末尾

3. 文件的关闭
3.1 函数原型
#include <stdio.h>
int fclose(FILE *stream);
  • 返回值:成功返回0,失败返回EOF(-1)并设置errno
  • 关键作用
    1. 将缓冲区数据写入磁盘(避免数据丢失)
    2. 释放文件描述符(防止资源耗尽)
3.2 关闭注意事项
  • 必须检查指针非空
    if (fp != NULL) {
        fclose(fp);  // 安全关闭
    }
    
  • 常见错误:多次关闭同一文件指针导致程序崩溃。

4. 错误处理与调试
4.1 常见编译错误
错误信息原因解决方法
error: ‘errno’ undeclared未包含errno.h头文件#include <errno.h>
warning: implicit declaration of ‘strerror’未包含string.h头文件#include <string.h>
4.2 错误打印函数对比
函数头文件用法示例输出示例
perror("msg")stdio.hperror("fopen failed");fopen failed: No such file or directory
strerror(errno)string.hprintf("Error: %s", strerror(errno));Error: Permission denied

示例3:完整错误处理

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>   // 必须包含
#include <string.h>  // 必须包含

int main() {
    FILE *fp = fopen("nonexist.txt", "r");
    if (fp == NULL) {
        printf("Error code: %d\n", errno);            // 输出错误码
        printf("Error message: %s\n", strerror(errno)); // 输出详细描述
        perror("fopen failed");                      // 简写错误信息
        exit(EXIT_FAILURE);
    }
    fclose(fp);
    return 0;
}

5. 关键注意事项
  1. 必须检查fopen返回值
    FILE *fp = fopen("data.txt", "r");
    if (fp == NULL) { /* 处理错误 */ }
    
  2. 避免野指针:关闭文件后,将指针设为NULL
    fclose(fp);
    fp = NULL;  // 防止误操作
    
  3. 缓冲区刷新:程序崩溃时,未关闭文件可能导致数据未保存,可手动刷新:
    fflush(fp);  // 强制将缓冲区数据写入磁盘
    

总结流程图

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        printf("Usage: %s <filename>\n", argv[0]);
        return 1;
    }
    FILE *fp = fopen(argv[1], "r+");
    if (fp == NULL)
    {
        // perror("fopen");
        printf("error:%s\n", strerror(errno));
        return 1;
    }
    
    /*读写操作*/
    
    fclose(fp);
    return 0;

}

打开文件 (fopen) → 检查返回值 → 读写操作 → 关闭文件 (fclose)
↑ ↓
└── 错误处理 (perror/strerror)

相关文章:

  • 鸿蒙中打开相机相册
  • AIGC时代:如何快速搞定Spring Boot+Vue全栈开发
  • *基础算法(1)
  • Linux之df命令
  • 网络安全工作怎么样?
  • 【CPU】Hart ID是什么(草稿)
  • AutoGen学习笔记系列(三)Tutorial - Agents
  • 深拷贝 浅拷贝防御性拷贝
  • 每日一题洛谷普及/提高-P1154 奶牛分厩c++
  • SAP MDG —— MDG on S/4HANA 2023 FPS03 创新汇总
  • mapbox进阶,使用点类型geojson加载symbol符号图层,用于标注带图标的注记,且文字居中在图标内,图标大小自适应文字
  • html | 预览一个颜色数组
  • OpenHarmony文件管理子系统
  • Kubernetes集群部署实战:从零到英雄
  • 【Flutter】正方形的Dialog
  • 通俗易懂的聚类算法之K均值详解
  • 嵌入式开发:磁通门传感器开发(4):自然环境中的磁场
  • Pycharm配置ROS开发环境
  • 《Docker 核心概念揭秘:如何让软件开发像烹饪一样简单》
  • 【前端进阶】14 提升编程体验:组件化与模块化
  • 做地铁建设的公司网站/汕头seo外包平台
  • 哪些网站可以做招生/网上营销方式和方法
  • 深圳沙井做网站/网络营销个人感悟小结
  • 简单的英文网站模板/郑州今日头条
  • 广元专业高端网站建设/淘宝店铺运营
  • 网站建设运动会成绩管理系统/软文营销常用的方式