目录
背景及概念介绍
C文件接口
fopen
open
fread/fwrite
read/write
fclose
close
补充
小知识
背景及概念介绍
1.文件分为打开的文件和被打开的文件。
2.未打开的文件存在磁盘上。
3.依据冯诺依曼体系,访问一个文件都需要先打开文件,就是将文件加载到内存中,因为CPU只能和内存交流。
4.操作系统(OS)内一定存在大量被打开的文件(运行起来所必要的程序文件)。
所以会存在一种结构体,来描述被打开的文件,像PCB描述进程一样。
5.对文件的所有操作,都是对外设(磁盘、显示器、键盘等)的输入和输出,简称IO。
6.文件操作本质是进程对文件的操作。
7.磁盘的管理者是操作系统。
C文件接口
fopen
用来打开文件的C语言库函数,其中pathname为路径(只给文件名默认在当前路径下),mode为打开模式。
mode 打开模式有许多种,常用如下:
open
对于一个语言级别的库函数来说,它想要与内存等交流需要通过管理者操作系统来进行,所以fopen底层封装了open系统调用。
pathname依旧为路径(只给文件名默认在当前路径下)
flags为一个用来区分模式的数字,传参时,会传给它不同的宏(一个只有某个比特位是1的数字,运用位图传递标志位,比如1 2 3 8 16等)
常用如下:
mode为权限,就是文件的rwx权限。
例:多种宏组合成一个模式
fd是文件描述符,用来标识一个文件。
fread/fwrite
fread参数表
对于使用fread时,可以使用feof判断是否读到文件结尾
fwrite参数表
read/write
read:fread封装的系统调用
write:fwrite封装的系统调用
fseek/rewind
文件指针:就是一个用来指向文件位置的指针,可以将文件看做一维数组,文件指针就是数组指针。
rewind:定位文件指针到最开头
fseek:定位文件指针。
fseek参数表
fclose
close
补充
1.进程在启动时,就会默认打开三个文件,stdin,stdout,stderror,就是标准输入,标准输出,标准错误。
2.本质向显示器中写入,就是向stdout文件中写入。
3.为什么C语言要封装文件操作接口
(1)系统调用的使用需要的知识较多,直接使用成本较高。
(2)不同操作系统的接口不同,为了C语言的跨平台性和可移植性。(C标准库中,对各种操作系统都进行封装,采用条件编译进行区分)。
小知识
1.向显示器中输出时,都是以字符形式,比如一个int类型234,打印时是拆成一个一个的字符‘4’‘5’‘6’来打印的,叫格式化输出。
2.显示器和键盘都是文本文件,需要格式化工作,而对于二进制文件来说,不需要格式化工作。
3.文件本身的属性决定了它是二进制文件还是文本文件,而不是因为调用了不同的接口。