一、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;
}
-
定义文件指针
FILE* pFILE;
:声明了一个指向FILE
结构的指针变量pFILE
,这个结构是C语言标准I/O库中用于文件操作的数据结构。 -
尝试打开文件
pFILE = fopen("unexist.ent", "r");
:fopen
函数尝试以只读模式("r")打开名为 "unexist.ent" 的文件。- 如果文件成功打开,
fopen
返回一个指向新打开文件的FILE
指针。 - 如果文件打开失败,
fopen
返回NULL
。
-
检查文件是否成功打开:
if (pFILE == NULL) { ... }
:如果pFILE
为NULL
,说明文件打开失败。
-
打印错误信息:
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是一样的。
本期内容就到此结束啦,喜欢的家人们可以点点关注点点赞!