库函数的模拟实现(strerror、perror)

一、strerror函数说明

还是老规矩先给家人们把cplusplus地址贴上。

函数总结:

  • 返回的字符串指针指向的是一个静态分配的字符串,程序不应该尝试修改这个字符串。
  • 多次调用 strerror 可能会覆盖之前返回的字符串内容,不同的库实现可能不保证避免数据竞争问题。
  • 由 strerror 生成的错误字符串可能因系统和库实现而异。

二、strerror函数使用

很重要的一点切勿忘了包含errno.h头文件!

#include<string.h>
#include<errno.h>
int main()
{
	FILE* pFILE;
	pFILE = fopen("unexist.ent", "r");
	if (pFILE == NULL)
	{
		printf("Error opening file unexist.ent: %s\n", strerror(errno));
	}
	return 0;
}

 

  1. 定义文件指针 FILE* pFILE;:声明了一个指向 FILE 结构的指针变量 pFILE,这个结构是C语言标准I/O库中用于文件操作的数据结构。

  2. 尝试打开文件 pFILE = fopen("unexist.ent", "r");

    • fopen 函数尝试以只读模式("r")打开名为 "unexist.ent" 的文件。
    • 如果文件成功打开,fopen 返回一个指向新打开文件的 FILE 指针。
    • 如果文件打开失败,fopen 返回 NULL
  3. 检查文件是否成功打开

    • if (pFILE == NULL) { ... }:如果 pFILE 为 NULL,说明文件打开失败。
  4. 打印错误信息

    • printf("Error opening file unexist.ent: %s\n", strerror(errno));
      • 使用 printf 函数打印错误信息。
      • 第一个参数是格式化字符串,%s 是字符串格式说明符,用来插入随后的字符串参数。
      • 第二个参数是 strerror(errno) 的结果,strerror 函数根据全局变量 errno 的当前值(由 fopen 失败时设置),返回一个指向描述错误的字符串的指针。

三、部分错误码

    #define EPERM 1 /* Operation not permitted */
  #define ENOENT 2 /* No such file or directory */
  #define ESRCH 3 /* No such process */
  #define EINTR 4 /* Interrupted system call */
  #define EIO 5 /* I/O error */
  #define ENXIO 6 /* No such device or address */
  #define E2BIG 7 /* Argument list too long */
  #define ENOEXEC 8 /* Exec format error */
  #define EBADF 9 /* Bad file number */
  #define ECHILD 10 /* No child processes */
  #define EAGAIN 11 /* Try again */
  #define ENOMEM 12 /* Out of memory */
  #define EACCES 13 /* Permission denied */
  #define EFAULT 14 /* Bad address */
  #define ENOTBLK 15 /* Block device required */
  #define EBUSY 16 /* Device or resource busy */
  #define EEXIST 17 /* File exists */
  #define EXDEV 18 /* Cross-device link */
  #define ENODEV 19 /* No such device */
  #define ENOTDIR 20 /* Not a directory */
  #define EISDIR 21 /* Is a directory */
  #define EINVAL 22 /* Invalid argument */
  #define ENFILE 23 /* File table overflow */
  #define EMFILE 24 /* Too many open files */
  #define ENOTTY 25 /* Not a typewriter */
  #define ETXTBSY 26 /* Text file busy */
  #define EFBIG 27 /* File too large */
  #define ENOSPC 28 /* No space left on device */
  #define ESPIPE 29 /* Illegal seek */
  #define EROFS 30 /* Read-only file system */

四、perror函数拓展

perror函数大致功能与strerror相似,但是它会直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印一个冒号和一个和空格,再打印错误信息。

#include<string.h>
#include<errno.h>
int main()
{
	FILE* pFILE;
	pFILE = fopen("unexist.ent", "r");
	if (pFILE == NULL)
	{
		perror("Error opening file unexist.ent");
	}
	return 0;
}

效果和strerror是一样的。

本期内容就到此结束啦,喜欢的家人们可以点点关注点点赞!

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值