《小菜狗 C 语言入门 + 进阶笔记》(40)文件是什么?【你知道什么是流?什么是文件指针file *?】


《小菜狗 C 语言入门 + 进阶笔记》目录:《小菜狗 C 语言入门 + 进阶笔记》(0)简介

1、文件是什么?

文件是数据源的一种,最主要的作用是保存数据。比如常见的 Word 文档、txt 文件、源文件等。

**C 语言具有操作文件的能力:**比如打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。

文件是存储在计算机存储设备(如硬盘、闪存等)上的⼀组数据,可以持久保存。文件可以分为文本文件和⼆进制文件两种类型

  • 文本文件:由字符组成,可以使用文本编辑器打开查看和编辑。
  • ⼆进制文件:以字节为单位存储,存储的是⼆进制的信息,不便于直接查看和编辑。

2、流是什么?

我们程序中产⽣的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念

C 程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。

C 语言具有操作流的能力: 我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作,最后关闭流。

在 C 语⾔中,流通常使用标准库中的 stdio.h 库中的流处理函数来操作。

C 语⾔中的流可以分为输入流和输出流两种类型。

  • 输入流(Input Stream):用于从外部获取数据,常见的输入流包括标准输入流 stdin 和文件输入流
  • 输出流(Output Stream):用于将数据发送到外部,常见的输出流包括标准输出流 stdout 和文件输出流

3、输入输出

输入输出(Input output,IO)是指程序(内存)与外部设备(键盘、显示器、磁盘、其他计算机等)进行交互的操作。几乎所有的程序都有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等。通过输入和输出操作可以从外界接收信息,或者是把信息传递给外界。

4、标准流

为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

那是因为 C 语⾔程序在启动的时候,默认打开了 3 个流

  • stdin - 标准输入流,在大多数的环境中从键盘输入,scanf 函数就是从标准输入流中读取数据。
  • stdout - 标准输出流,大多数的环境中输出⾄显⽰器界面,printf 函数就是将信息输出到标准输出流中。
  • stderr - 标准错误流,大多数环境中输出到显⽰器界面。

这是默认打开了这三个流,我们使用 scanf、printf 等函数就可以直接进行输入输出操作的。

  • 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据;
  • 通常把键盘称为标准输入文件,scanf 就是从这个文件读取数据。
文件硬件设备
stdin标准输入文件,一般指键盘;scanf()、getchar() 等函数默认从 stdin 获取输入。
stdout标准输出文件,一般指显示器;printf()、putchar() 等函数默认向 stdout 输出数据。
stderr标准错误文件,一般指显示器;perror() 等函数默认向 stderr 输出数据(后续会讲到)。
stdprn标准打印文件,一般指打印机。

回忆一下如何使用标准输入流和标准输出流进行数据的输入输出

#include <stdio.h>
int main()
{
    int num;
    printf("请输入⼀个数字:"); // 输出到标准输出流
    scanf("%d", &num); // 从标准输入流获取数据
    printf("你输入的是:%d\n", num); // 输出到标准输出流
    return 0;
}

5、文件指针与文件信息区

stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为文件指针

C 语⾔中,就是通过 FILE* 的文件指针来维护流的各种操作

每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。

这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE

例如,编译环境提供的 stdio.h 头文件中有以下的文件类型申明:

struct _iobuf {
    char *_ptr;
    int _cnt;
    char *_base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char *_tmpfname;
};
typedef struct _iobuf FILE;

不同的 C 编译器的 FILE 类型包含的内容不完全相同,但是大同小异。

每当打开⼀个文件的时候,系统会根据文件的情况自动创建⼀个 FILE 结构的变量,并填充其中的信息,使用者不必关心细节。

⼀般都是通过⼀个 FILE 的指针来维护这个 FILE 结构的变量,这样使用起来更加方便。

6、文件指针定义

我们创建⼀个 FILE* 的指针变量:

FILE* pf;//文件指针变量

pf 是⼀个指向 FILE 类型数据的指针变量

可以使 pf 指向某个文件的文件信息区(是⼀个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

如下图所示:

在这里插入图片描述


《小菜狗 C 语言入门 + 进阶笔记》目录:《小菜狗 C 语言入门 + 进阶笔记》(0)简介

每日一更!

公众号、优快云等博客:小菜狗编程笔记

谢谢点赞关注哈!目前在飞书持续优化更新~

日更较慢有需要完整笔记请私我,C/C++/数据结构-算法/单片机51-STM32-GD32-ESP32/嵌入式/Linux操作系统/uboot/Linux内核-驱动-应用/硬件入门-PCB-layout/Python/后期小程序和机器学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹅编程笔记

你的鼓励将是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值