【C语言】处理文件错误:详解 strerror, perror, 和 fopen

news2024/12/28 20:59:12

🦄个人主页:小米里的大麦-CSDN博客

🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html

⚙️操作环境:Visual Studio 2022

目录

一、引言

二、fopen 函数

解释:

1. 函数原型

2. 参数

3. 代码示例

三、strerror 函数

1. 函数原型

2. 参数

3. 代码示例

四、perror 函数

1. 函数原型

2. 参数

3. 代码示例

五、总的来说(可直接跳转至此处开始)

1. 错误处理的基础

errno 变量

strerror 函数

注意事项

2. 这里数据太多,所以我整理了常见的错误码及其描述:

3. 代码示例

3.1 示例一 

3.2 示例二 

4. 日常使用示例

六、总结

综合使用的重要性

七、共勉


一、引言

在 C 语言编程中,处理错误是非常重要的,尤其是当涉及到文件操作时。本文将详细介绍三个常用的错误处理函数:strerror, perror, 和 fopen 的使用方法。这些函数可以帮助开发者更好地理解和处理程序中发生的错误。

错误处理是编程中不可或缺的一部分。当程序遇到问题时,如文件无法打开或内存分配失败,程序需要能够捕捉这些错误并给出适当的反馈。C 语言提供了多种机制来处理这类错误,其中包括 strerrorperror 函数,它们可以提供详细的错误信息。

此外,我们还将讨论 fopen 函数,这是 C 语言中用于打开文件的标准函数。fopen 函数无法成功打开文件时,我们需要能够正确地处理这种失败,并向用户或开发者提供清晰的错误信息。

二、fopen 函数

解释:

  • fopen 是一个用于打开文件的标准库函数。它可以读取、写入或同时读写文件。如果文件不存在,fopen 可以创建新文件;如果文件存在,fopen 可以打开并重用它。
  • 即:fopen 是一个用于打开文件的函数,它可以在不同的模式下打开文件。如果我们尝试打开一个不存在的文件,或者因为权限问题无法打开文件,fopen 会返回 NULL。因此,我们通常会检查 fopen 的返回值是否为 NULL 来判断文件是否成功打开。

还是先来看看fopen - C++ Reference上的介绍:

1. 函数原型

#include <stdio.h>
FILE *fopen(const char *filename, const char *mode);

2. 参数

  • filename: 要打开的文件的路径和名称。
  • mode: 指定了打开文件的方式,常见的模式有 "r"(只读)、"w"(清空并写入新的数据)、"a"(追加到文件末尾)和 "r+"(读写)等。

3. 代码示例

#include <stdio.h>

int main() {
    FILE* fp = fopen("test.txt", "r");
    if (fp == NULL) {
        // 处理打开失败的情况
        return 1;
    }

    // 文件成功打开后的操作...

    fclose(fp);//关闭文件
    return 0;
}

三、strerror 函数

strerror 函数是用来获取错误描述字符串的。当 fopen 或者其他函数失败时,它们通常会设置全局变量 errno 来表示错误的原因。strerror 可以将 errno 的值转换成一个描述性的字符串,从而帮助我们了解具体的错误信息。

strerror - C++ Reference 的介绍:

1. 函数原型

#include <string.h>
const char *strerror(int errnum);

2. 参数

errnum: 错误码,通常直接使用 errno

3. 代码示例

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

int main() {
    FILE* fp = fopen("test.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "Failed to open file: %s\n", strerror(errno));
        return 1;
    }

    // 文件成功打开后的操作...

    fclose(fp);
    return 0;
}

四、perror 函数

perror 函数与 strerror 类似,但它会自动将错误描述打印到标准错误流(stderr)。此外,perror 还会在错误描述前加上一个自定义的消息,通常用来指定出错的函数名称。

perror - C++ Reference的介绍:

1. 函数原型

#include <stdio.h>
void perror(const char *msg);

2. 参数

msg: 一个字符串,通常表示出错的函数名称或其他相关信息。

3. 代码示例

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

int main() {
    FILE* fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("fopen");
        return 1;
    }

    // 文件成功打开后的操作...

    fclose(fp);
    return 0;
}

五、总的来说(可直接跳转至此处开始)

1. 错误处理的基础

  • 在编程时,我们经常会遇到一些错误或异常情况。例如,打开文件失败、内存分配不足等。当这些错误发生时,程序通常会返回一个错误码,以便开发者能够识别出发生了什么问题。
  • 在 C 语言中,错误码通常是通过全局变量 errno 来传递的。errno 是一个整数变量,它会在系统调用或者库函数失败时被设置为特定的值来表示不同的错误类型。

errno 变量

  • errno 是一个预定义的全局变量,在 <errno.h> 头文件中定义。每次系统调用或库函数失败后,它会被设置成一个表示错误原因的整数值。每个错误码都有一个对应的描述字符串,可以帮助理解错误的具体含义。

strerror 函数

  • strerror 函数的作用是将 errno 的值转换成相应的错误描述字符串。这样你就可以通过打印这个字符串来告诉用户发生了什么错误。

注意事项

  • strerror 返回的字符串可能被其他调用覆盖,因此如果需要保留错误消息,应该复制到另一个字符串中。
  • 不同的操作系统可能有不同的错误码和错误消息。

2. 这里数据太多,所以我整理了常见的错误码及其描述:

 strerror 函数返回与给定错误码 (errno) 相对应的错误描述字符串。每个错误码都有一个特定的意义,并且与之对应有一个描述性的字符串。这些错误码及其描述字符串是由操作系统定义的,并且在不同平台上可能会有所不同。然而,大多数常见的错误码和它们的含义在各种 Unix 和类 Unix 系统(包括 Linux)中都是通用的。 

请注意,下面列出的错误码和描述并不是所有可能的错误码,而且具体的错误码数值和描述可能会根据不同的系统和平台有所不同。在实际使用中,你可以查阅你所使用的系统的文档来获取更准确的信息。 

3. 代码示例

3.1 示例一 

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

int main() {
    int error_number = 2; // 假设这里发生了错误 2: No such file or directory
    const char *error_string = strerror(error_number);
    printf("Error description: %s\n", error_string);

    return 0;
}


运行上述代码会输出:
Error description: No such file or directory

3.2 示例二 

int main() {
    printf("%s\n", strerror(0));   // No error
    printf("%s\n", strerror(1));   // Operation not permitted
    printf("%s\n", strerror(2));   // No such file or directory
    printf("%s\n", strerror(3));   // No such process
    printf("%s\n", strerror(4));   // Interrupted function call
    printf("%s\n", strerror(5));   // Input/output error

    return 0;
}
  • strerror(0):No error (没有错误)
  • strerror(1):Operation not permitted (操作未被允许)
  • strerror(2):No such file or directory (没有这样的文件或目录)
  • strerror(3):No such process (没有这样的进程)
  • strerror(4):Interrupted function call (中断的函数调用)
  • strerror(5):Input/output error (输入/输出错误)

4. 日常使用示例

#include <stdio.h>    // 包含标准输入输出头文件
#include <stdlib.h>   // 包含标准库函数头文件,如 calloc 和 free

int main()
{
    int *p = (int*)calloc(10, sizeof(int));  // 分配足够的内存来存储10个整数,并初始化为0
    if (NULL == p)                           // 如果内存分配失败(p为NULL)
    {
        perror("calloc");                    // 打印错误信息
        return 1;                            // 返回非零值,表示程序异常终止
    }

    // 使用
    int i = 0;                               // 初始化循环变量
    for (i = 0; i < 10; i++)                 // 循环遍历数组中的每个元素
    {
        printf("%d ", *(p + i));             // 输出第i个元素的值
    }

    // 释放内存
    free(p);                                 // 释放之前分配的内存
    p = NULL;                                // 将指针设置为NULL以避免悬挂指针问题

    return 0;                                // 正常退出程序
}
这段代码的主要功能如下:

使用 calloc 函数分配足够空间来存放10个整数,并且将这些整数初始化为0。
检查内存是否成功分配,如果没有分配成功,则打印错误信息并退出程序。
使用一个循环来遍历这个整数数组,并打印每个整数的值。
使用 free 函数释放之前分配的内存。
将指针 p 设置为 NULL 以避免后续使用该指针时产生悬挂指针的问题。
最后返回0表示程序正常结束。

六、总结

综合使用的重要性

  • 错误处理的最佳实践:在文件操作中,结合使用 fopenstrerror, 和 perror 是一种很好的错误处理策略。
  • 提高程序健壮性:通过检查错误条件并提供清晰的错误信息,可以提高程序的稳定性和可靠性。
  • 易于维护:良好的错误处理机制使得代码更容易理解和维护,尤其是在大型项目中。

处理文件错误是一项基本但又复杂的任务。fopen, strerror, 和 perror 这些工具的正确使用能够显著提升程序的质量,使开发者能够更加高效地解决问题。通过掌握这些技巧,开发者可以构建更加健壮、可靠的应用程序。

七、共勉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

形象设计大赛活动方案策划

一、活动流程 1、个人创意服装展示&#xff08;30分&#xff09;&#xff1a;选手自备服装&#xff0c;要能展示现代大学生青春、时尚&#xff0c;富有内涵的高雅气质和礼仪风范&#xff08;如:校园装、运动装、休闲装和职业装&#xff09;。 由评委评判出对选手的第一印象分。…

代码随想录二刷(哈希表)

代码随想录二刷(哈希表) 三数之和思路反正对于我来说是真的难想出来。 若这道题还是采用哈希表的思路去做&#xff0c;非常麻烦&#xff0c;并且还要考虑去重的操作。所以这道题其实用双指针&#xff0c;是更方便的。 具体程序如下&#xff1a; class Solution:def threeSu…

SPON IP网络对讲广播系统的命令执行漏洞复现实验

第一步&#xff1a;使用fofa搜索语句搜索 fofa地址&#xff1a;网络空间测绘&#xff0c;网络空间安全搜索引擎&#xff0c;网络空间搜索引擎&#xff0c;安全态势感知 - FOFA网络空间测绘系统 查询漏洞的语句icon_hash"-1830859634" 第二步&#xff1a;访问网址&…

LangChain大模型应用开发指南-传统编程范式思维的应用

LangChain大模型应用开发指南-传统编程范式思维的应用 上节课&#xff0c;我带领小伙伴们完成了baichuan2量化模型的OpenAI标准接口封装&#xff0c;并完成LangChain对大模型的调用与测试。 今天我们将正式开始LangChain大模型应用开发课程。 组件总览 上图为LangChain的组件与…

软件工程之应用数学

软件工程之应用数学 第 20 章&#xff1a;应用数学20.1 运筹方法20.1.1 网络计划技术20.1.2 线性规划20.1.3 决策论20.1.4 对策论 20.2 数学建模 第 20 章&#xff1a;应用数学 数学是一种严谨、缜密的科学&#xff0c;学习应用数学知识&#xff0c;可以培养系统架构设计师的抽…

机器学习三步走:手写BP神经网络(入门) --> 基于TensorFlow框架开发(开发) --> 基于预训练模型快速构建应用(应用)

目录 前言第一步&#xff1a;手写BP神经网络1 概念简介1.1 神经网络内的概念1.2 神经网络外的概念 2 类BPNetwork2.1 初始化2.2 激活函数2.2.1 Sigmod2.2.2 Linear2.2.3 Sigmod_derivative 2.3 损失函数2.4 前向传播2.5 后向传播2.6 训练模型2.7 预测2.8 绘制损失值变化曲线 **…

实验 19. 用户进程

已完成实验 已完成实验链接 简介 实验 19. 用户进程 总结 main函数创造了1个主线程&#xff0c;两个内核线程&#xff0c;两个用户进程。共5个PCB&#xff0c;进程PCB->pgdir为进程自己的页表首虚拟地址&#xff0c;线程为null。因此本次实验是五个进/线程在来回切换。他…

抖音素材网站有哪些?这几个高质量的抖音无水印素材网站分享

在抖音这个视觉与创意并重的平台上&#xff0c;选择合适的无水印视频素材是提升内容质量的关键。如果你正在寻找既能使你的视频内容更具吸引力&#xff0c;又能避免版权问题的优质素材&#xff0c;那么本文将为你详细介绍几个高质量的抖音无水印素材网站。从国内的蛙学网到国际…

双指针算法大总结!!看完这篇再也没有难的双指针题!!例题C++解法!

题源acwing、力扣 讲解双指针题目一&#xff1a;盛最多水的容器思路AC代码 题目二&#xff1a;查找总价格为目标值的两个商品思路AC代码 题目三&#xff1a;链表的中间节点思路AC代码 题目四&#xff1a;环形链表思路AC代码 题目五&#xff1a;反转字符串中的元音字符思路AC代码…

【Vulnhub靶场AI-WEB-1.0打靶教程】

第一步&#xff1a;查看虚拟机的ip 第二步&#xff1a;扫描ip下开放的80端口 第三步&#xff1a;扫描查到的ip地址下的目录 第四步&#xff1a;访问查到的目录 访问robot.txt 第五步:访问robot.txt显示出的目录 第六步&#xff1a;打开kali终端&#xff0c;使用sqlmap功能 sq…

【Vue3】标签的 ref 属性

【Vue3】标签的 ref 属性 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。…

win10游戏出现错误代码0xc0000142是什么情况?几种方法修复错误代码0xc0000142

错误代码 "0xc0000142" 通常表示应用程序无法正确启动&#xff0c;这经常与系统文件损坏、兼容性问题或环境设置不当有关。下面列出了一些步骤&#xff0c;可能帮助你解决在Windows 10上运行游戏时遇到的0xc0000142错误。 快速修复错误代码0xc0000142问题 1. 以管理…

更新Win11后出现无法检测到相机的情况

使用腾讯会议的时候发现摄像头用不了&#xff0c;显示“未检测到摄像头”&#xff0c;打开设置显示“未找到任何相机” 试了很多方法都解决不了&#xff0c;后用了下面这种方法成功解决&#xff0c;相机就能用了 1.下载360驱动大师&#xff0c;检测下有没有要更新或者添加的驱…

希尔排序【C语言】

希尔排序 前言 在上一篇文章中我们了解了直接插入排序算法&#xff08;建议先阅读&#xff09;&#xff0c;但其实这个算法还是有一定优化空间的。而它优化之后&#xff0c;就变成了另一个大名鼎鼎的排序算法&#xff1a;希尔排序。 希尔排序(Shell’s Sort)是插入排序的一种…

PDF怎么转换成Word?这些工具一键搞定!

在日常生活中&#xff0c;我们经常遇到需要将PDF文件转换成Word文档的情况。PDF怎么转换成Word&#xff1f;一些工具的使用十分重要&#xff01;下文中就为大家推荐几个亲测好用的PDF转换工具。 一、Foxit PDF转换大师&#xff08;365客户端&#xff09; 链接&#xff1a;www…

【Story】编程迷航:从 “ 我怎么才学会 ? ” 到 “ 我怎么这么厉害 ! ”

目录 大学生编程入门指南&#xff1a;选择语言、制定计划与避坑技巧1. 选择适合的编程语言1.1 Python1.2 Java1.3 C/C1.4 JavaScript1.5 SQL 2. 制定有效的学习计划2.1 设定明确的目标2.2 制定学习时间表2.3 选择学习资源2.4 实践和项目 3. 避免常见学习陷阱3.1 避免过度焦虑3.…

7月31日学习笔记 基于域名,Ip,端口多虚拟主机配置以及上线商城系统

一&#xff0c;基于域名的虚拟主机 效果 劫持域名访问指定的文件夹的目录 步骤 1. vim /usr/local/nginx/conf/nginx.conf 2. 创建新的目录 mkdir /html/devopt/ 3. 在 devops 目录下添加新的 index.html 文件 4. 在 http 模块下添加新的 server 模块 1 . 设置监听的端…

数字的位操作——7、9、479、564、231、342

7. 整数反转(中等) 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&…

钢铁无组织排放的超低改造(朗观视觉)

朗观视觉小编观察发现&#xff1a;随着环保政策的日益严格和公众对环境质量要求的不断提高&#xff0c;钢铁行业作为重工业的代表&#xff0c;面临着巨大的环保压力。无组织排放作为钢铁企业环保治理的难点之一&#xff0c;如何实现超低排放成为行业关注的焦点。本文将从技术路…

MAC安装mysql以及配置环境变量

安装mysql 下载mysql,网址&#xff1a;MySQL :: Download MySQL Community Server 我下载的版本是mysql-9.0.1-macos14-arm64.dmg 打开&#xff0c;双击 一路点击继续安装即可&#xff1b; 最后需要给root设置密码后就安装完成了 但是打开终端输入mysql&#xff0c;依然显…