✅作者简介:热爱科研的嵌入式软件开发者,修心和技术同步精进,关注我,一起变得更加优秀!
🍎个人主页:anything_possible
代码获取、问题探讨及文章的转载可私信!
🍎个人信条:种一棵树最好的时间是十年前,其次是现在
## **今天,我们需要对下面几项进行掌握吧:**
1、标准IO-打开文件(fopen函数)
2、标准IO-处理错误信息(打印错误信息函数)
3、标准IO-关闭文件(fclose函数)
1、标准IO-打开文件(fopen函数)
首先,想了解这个函数,在linux中,可以通过man查看用户手册。
(记住:man 2—查系统调用;man 3—查库函数)如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HP4zFtK4-1721814168427)(https://i-blog.csdnimg.cn/direct/a9c5d67898924e9b9431f3ce402b9298.png)]
fopen函数原型:
FILE *fopen(const char *pathname, const char *mode);
注意:
r-read(读模式);w-write(写模式);a-add(追加模式)
①FILE 是一个结构体类型,它在 <stdio.h> 中定义,用于表示一个文件流。FILE 结构体包含了文件描述符、缓冲区、错误标志等信息。
②pathname:这是一个指向以 null 结尾的字符串的指针,表示要打开的文件的路径。
③mode:表示文件打开的模式(下面接着介绍模式有哪些)
| mode | 作用 |
|---|---|
| “r” | 打开一个文件用于读取。如果文件不存在,返回错误。 |
| “r+” | 打开一个文件用于读写。如果文件不存在,返回错误。 |
| “w” | 打开一个文件用于写入。如果文件已存在,截断为零长度;如果文件不存在,创建新文件。 |
| “w+” | 打开一个文件用于读写。如果文件已存在,截断为零长度;如果文件不存在,创建新文件。 |
| “a” | 以追加模式打开文件。如果文件已存在,写入操作从文件末尾开始;如果文件不存在,创建新文件。 |
| “a+” | 以追加模式打开文件用于读写。如果文件已存在,写入操作从文件末尾开始;如果文件不存在,创建新文件。 |
以下代码就是使用方法,形参都是字符串常量(记得双引号)
// 使用双引号定义字符串字面量
FILE *fp = fopen("example.txt", "r");
2、标准IO-处理错误信息
分别是三个变量以及函数:
①errno——extern int errno;
②perror(常用)
③strerror
接下来我会对上面三个变量及函数进行讲解:
①errno:
头文件:#include<errno.h>;
- 说明:errno 是一个全局变量,用于存储最后一次系统调用中的错误代码。它是 int类型,通常在调用失败时被设置。
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp = fopen("1.txt", "r");
if (fp == NULL) {
printf("Error opening file: %d\n", errno);
}
return 0;
}
②perror:
头文件:#include<stdio.h>;
原函数:void perror(const char *S);
- 说明:
perror 是一个函数,用于输出错误信息到标准错误流(通常是屏幕)。它将 errno 变量对应的错误代码转换成可读的错误消息,并将其输出。 - 参数:
S:一个以 NULL 结尾的字符串,作为错误消息的前缀。 - 返回值:无(void 类型)。
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp = fopen("1.txt", "r");
if (fp == NULL) {
perror("Error opening file");
}
return 0;
}
③strerror
头文件:#include<string.h>
原函数:char *strerror(int errno);
- 说明:strerror 是一个函数,用于将错误代码转换成可读的错误描述字符串。
- 参数: errno:一个整数,表示错误代码。
- 返回值:返回一个指向以 NULL结尾的错误描述字符串的指针。这个字符串不应该被释放,因为它可能指向一个静态分配的字符串。
- 使用:当你需要将错误代码转换为可读的字符串时,使用 strerror。这在需要自定义错误消息或记录错误日志时非常有用。
#include <stdio.h>
#include<string.h>
int main() {
FILE *fp = fopen("1.txt", "r");
if (fp == NULL) {
printf("Error opening file: %s\n", strerror(errno));
}
return 0;
}
总结——记忆方法:
errno:想象一个“error number”(错误编号),它是一个存储错误代码的变量。
perror:想象“print error”(打印错误),它是一个输出错误消息的函数。 strerror:想象“string
error:想象“string error”(字符串错误)它是一个将错误代码转换为字符串的函数。
3、标准IO-关闭文件(fclose函数)
首先,想了解这个函数,在linux中,可以通过man查看用户手册。
(记住:man 2—查系统调用;man 3—查库函数)如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUmttKuf-1721814168428)(https://i-blog.csdnimg.cn/direct/aac0144880f841ae8ac58374ae889da4.png)]
函数原型:
int fclose(FILE *stream);
-参数说明:
- stream: 这是一个指向 FILE 结构的指针,表示要关闭的文件流。
- 通常,这个 FILE 指针是通过 fopen 函数获得的。
-返回值:
- 成功时,返回 0。
- 失败时,返回 EOF(文件结束标志),并设置 errno 以指示错误原因。
使用注意事项:
- 检查返回值:在调用 fclose 后,应检查返回值以确认文件是否成功关闭。
- 刷新缓冲区:在关闭文件之前,应确保所有缓冲区中的数据都已写入文件。可以使用 fflush 函数刷新缓冲区。(重点)
- 释放资源:fclose 函数会释放与文件流关联的资源,包括内存和文件描述符。
- 多次关闭:不应多次关闭同一个文件流,这可能会导致未定义的行为。
- 错误处理:如果 fclose 返回 EOF,应检查 errno 以确定错误原因。
示例:
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp = fopen("1.txt", "w");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
// 写入一些数据到文件
fputs("Hello, World!\n", fp);
// 刷新缓冲区并关闭文件
if (fclose(fp) == EOF) {
perror("Error closing file");
printf("Error code: %d\n", errno);
return -1;
}
return 0;
}

被折叠的 条评论
为什么被折叠?



