6、文件IO
文件IO:Linux内核提供的文件操作接口。属于系统调用
函数接口:
打开文件---》读写文件---》关闭文件
open
read、write
close
- open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:打开一个文件,并获得一个文件描述符参数:
pathname:要打开文件的文件名
flags:打开方式
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
O_CREAT:创建
O_TRUNC:清空
O_APPEND:追加
”r“ O_RDONLY
”r+“ O_RDWR
”w“ O_WRONLY | O_TRUNC | O_CREAT
"w+" O_RDWR | O_TRUNC | O_CREAT,0664
"a" O_WRONLY | O_CREAT | O_APPEND,0664
"a+" O_RDWR | O_CREAT | O_APPEND,0664,0664
mode:用户、同组用户、其他用户会该文件的读写执行权限
(mode & ~umask)
普通文件:0664
权限给满:0777(rwxrwxr-x
返回值:
成功:文件描述符
失败:-1
文件描述符:
当打开一个文件时,系统会为已打开的文件分配一个文件描述符用来标记该文件。
文件描述符:小的、非负的整形数据
操作系统默认可分配出的描述符:0~1023
文件描述符分配原则:最小未被使用
系统默认已打开的文件:
标准IO 文件IO
FILE* int
stdin 0(STDIN_FILENO)
stdout 1(STDOUT_FILENO)
stderr 2(STDERR_FILENO)
- close
#include <unistd.h>
int close(int fd);
功能:关闭文件
参数:
fd:文件描述符
返回值:
成功:0
失败:-1
注意:
只打开文件,不关闭文件,会造成文件描述符泄漏
- write
#include <unistd.h>
ssize_t write( int fd , const void *buf , size_t count );
功能:
向文间中写入数据
参数:
fd:被写入文件的文件描述符buf:要写入数据的首地址
count:希望写入的字节数
返回值:
成功:实际写入的字节数
失败:-1
- read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:从文件中读取数据
参数:
fd:要读取文件的文件描述符
buf:存储读取数据的空间首地址
count:希望读到的字节数
返回值:
成功:实际读到的字节数
失败:-1
到达文件末尾:0
文件定位函数:
- lseek
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
功能:重新定义文件的读写位置
参数:
fd:文件描述符
offset:偏移量
whence:要偏移的起始位置
SEEK_SET:从文件开头偏移
SEEK_CUR:从当前读写位置偏移
SEEK_END:从文件末尾偏移
返回值:
成功:返回当前读写位置到文件开头的偏移量
失败:-1
7、文件IO / 标准IO对比
| 标准IO |
文件IO | |
| 操作对象 | (FILE *)文件流指针 | (int)文件描述符 |
| 来源 | 标准C库,可移植性强 | Linux系统调用,可移植性弱 |
| 缓冲区 |
有缓冲区,目的是减少用户层 和内层反复切换,提高效率 | 无缓冲区,实时性好 |
| 应用场景 | 普通文件的操作 | 普通文件、硬件相关的文件 |
缓冲区
(1)行缓冲
默认大小1024字节(1k),使用在人机交互的终端上
刷新条件:
- 遇到‘\n’;
- 程序结束时刷新;
- 缓冲区满刷新
- fflush(stdout)强制刷新
(2)全缓冲
默认大小4096字节(4k),文件交互
刷新条件;
- c程序运行结束
- 文件关闭,自动刷新
- 全缓冲区满刷新
- fflush(fp)强制刷新
(3)无缓冲
0k,出错信息输出,标准出错设备
stdeer
8、其他函数接口
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
功能:将格式化后的字符串写入到stream文件流代表的文件中
int dprintf(int fd, const char *format, ...);
功能:将格式化后的字符串写入到fd文件描述符代表的文件中
int sprintf(char *str, const char *format, ...);
功能:将格式化后的字符串写入到字符型数组钟
应用:
- 字符串的拼接、格式化
- 整形,浮点型转转字符串
char *p="hello";
char *q="world";
char str[32]={0};
sprintf(str,"%s %s",p,q);
#include <string.h>
char *strtok(char *str, const char *delim);
功能:字符串截取函数
参数:
str:要截取的原始字符串
delim:要截断的分隔符
返回值:
成功:截取到的子字符串的首地址
失败:NULL(已经到字符串末尾)

152

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



