文件操作/标准IO(20250214)
1. 文件操作
1.1 必要性
保存数据至ROM(非易失性存储器)
Linux中的一切皆是文件,学习文件操作可以操作硬件设备
2 Linux文件类型(7种)
- b(block) 块设备文件 存储设备
- c(character)字符设备文件 输入输出设备:键盘、鼠标、显示器
- d(directory) 目录文件
- -(regular) 普通文件 *.c ,*.txt,a.out,*.jpg,*.mp4
- l(link) 软连接文件
- s(socket) 套接字文件 网络通信
- p(pipe) 管道文件 进程间通信
3 Linux下文件操作的方法
I: input O:output
3.1 标准IO
标准C库提供的一套文件操作接口
3.2 文件IO(属于系统调用)
Linux内核为Linux系统提供的一套文件操作接口
4 文件操作思想
- 打开文件
- 读文件、写文件
- 关闭文件
5. 标准IO
- 打开文件 fopen()
- 读文件、写文件 fgetc()/fputc、fgets()/fputs()、fread()/fwrite()
- 关闭文件 fclose()
标准IO:将一个打开的文件和一个文件流指针(FILE *)关联,后面操作文件,皆面向文件流指针
终端也是文件
操作系统默认打开了三个流:
- stdin 标准输入流 键盘
- stdout 标准输出流 显示屏(终端)
- stderr 标准出错流 显示屏(终端)
6. 函数接口
6.1 FILE *fopen(const char *pathname, const char *mode);
文件流:数据从文件流入和流出体现的字节流
FILE * ------>文件流指针
功能:打开一个文件,并且将文件关联到一个流上
参数:
pathname : 要打开的文件名的指针
mode:打开方式
"r" 以只读方式打开,文件必须存在
"r+" 以读写方式打开,文件必须存在
"w" 以只写的方式打开,文件不存在:创建,文件存在:清空
"w+" 以读写方式打开,文件不存在:创建,文件存在:清空
"a" 以追加写的方式打开,文件不存在:创建
"a+" 以读写方式打开,文件不存在:创建,文件存在:可追加写或从头读
返回值:
成功:FILE * :文件流指针
失败:NULL
6.2 int fputc(int c, FILE *stream);
功能:将一个字符写入到文件
参数:
c:写入的字符
stream:要写入的文件流指针
返回值:
成功:写入字符的ASCII值
失败:EOF (-1)
od -c 文件名 :查看文件中的字符
6.3 int fclose(FILE *stream);
功能:关闭一个文件
参数:stream:文件流指针
返回值:
成功:0
失败:EOF (-1)
6.4 int fgetc(FILE *stream);
功能:从文件中读取一个字符
参数:
stream:要读的文件流指针
返回值:
成功:读到的字符的ASCII值
失败:EOF
到达文件末尾:EOF
fgetc 和 fputc 是非常基础且实用的文件读写函数,它们可以方便地实现逐个字节的文件读写操作,适用于处理 ASCII 文件和二进制文件。在处理二进制文件时,记得使用二进制模式打开文件。
6.5 int fputs(const char *s, FILE *stream);
功能:将字符串写入到文件
参数:
s:要写入的字符串的首地址
stream:文件流指针
返回值:
成功:>=0
失败:EOF
6.6 char *fgets(char *s, int size, FILE *stream);
功能:从文件中读取一行数据(遇到\n停止)
参数:
s:读取到的数据存放的首地址
size:期待读到的字节数
stream:要读的文件流指针
返回值:
成功:返回存储数据的首地址(s)
失败:NULL
读到文件末尾:NULL
6.7 fgets和gets的区别:
- fgets会保留\n字符,gets会去掉\n
- gets是危险的,没有size的限制
- fgets最多读取size-1个字符
- fgets遇到\n停止读取