标准IO(总结篇二)

✅作者简介:热爱科研的嵌入式软件开发者,修心和技术同步精进,关注我,一起变得更加优秀!
🍎个人主页: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 以指示错误原因。

使用注意事项:

  1. 检查返回值:在调用 fclose 后,应检查返回值以确认文件是否成功关闭。
  2. 刷新缓冲区:在关闭文件之前,应确保所有缓冲区中的数据都已写入文件。可以使用 fflush 函数刷新缓冲区。(重点)
  3. 释放资源:fclose 函数会释放与文件流关联的资源,包括内存和文件描述符。
  4. 多次关闭:不应多次关闭同一个文件流,这可能会导致未定义的行为。
  5. 错误处理:如果 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值