基本概念
文件IO: 不带缓冲区的IO,每一次read,write都调用内核中的一个系统调用,称之为低级IO,操作系统提供的基本IO服务,与OS绑定,特定于Linux和Unix平台
标准IO: 标准IO处理了很多细节,对文件IO进行了封装,可移植性高,提供缓冲区(全缓冲、行缓冲、不带缓冲)
区别: 通过文件IO读写文件时,会频繁的进行系统调用,这样就增加了系统的开销;而标准I/O可以看成是在文件I/O的基础上封装了缓冲机制。先读写缓冲区,必要时再访问实际文件,从而减少了系统调用的次数
文件IO常用函数
<1>:打开文件
int open(const char *pathname, //文件名
int flags, //模式
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 可读可写
O_NOCTTY 以非终端形式打开
O_CREAT 可创建
mode_t mode); //权限
返回值: 失败-1
成功返回 3-1023
0—>stdin
1—>stdout
2—>stderr
<2>写入文件:
ssize_t write(int fd, //open返回值
const void *buf, //需要被写入的字符串的首地址—缓冲区
size_t count); //写入count个字节
返回值: 成功返回被写入的字节数,当没有数字被写的时候,返回0
失败返回-1
<3>读取文件
ssize_t read(int fd, //open返回值
void *buf, //从文件中读取到的字符串存放的首地址—缓冲区
size_t count); //读取count个字节
<4>偏移光标
off_t lseek(int fd, //open的返回值
off_t offset, //偏移的字节数 off_t表示可为正也可为负
int whence); //偏移的起始位置
SEEK_SET 文件头
SEEK_CUR 当前文件光标位置
SEEK_END 文件末尾
返回值:成功,返回从文件头到偏移后的光标所在位置的字节数
失败,返回-1
应用:获取文件大小
num = lseek(fd,0,SEEK_END);
<5>关闭文件
int close(int fd); //open返回值
返回值:成功返回0 失败返回-1
标准IO常用函数
<1>;打开文件
FILE *fopen(const char *path, //需要被打开的文件
const char *mode); //打开的模式
"r"只读模式
“r+” 可读可写模式
"w"只写,清空文件内容或创建新文件来写入
“w+” 可读可写,只有在文件不存在时,才会创建
"a"只写,从文件末尾追加写入
“a+” 可读可写,从文件末尾追加写入
返回值,成功返回结构体指针,失败返回NULL
<2>读取文件
size_t fread(void *ptr, //读取到的内容存放的首地址
size_t size, //一次读取的长度
size_t nmemb, //读取的次数
FILE *stream); //fopen的返回值
<3>写入文件
size_t fwrite(const void *ptr, //写入的内容存放的首地址
size_t size, //一次写入的长度
size_t nmemb, //写入的次数
FILE *stream); //fopen的返回值
<4>偏移文件光标
int fseek(FILE *stream, //fopen的返回值
long offset, //偏移的字节数
int whence); //开始偏移的位置
SEEK_SET 文件头
SEEK_CUR 当前文件光标位置
SEEK_END 文件末尾
返回值,成功返回0,失败返回-1
long ftell(FILE *stream); //fopen的返回值
返回值,成功返回当前文件光标距离头文件位置,失败返回-1
获取文件大小:
fseek(fp,0,SEEK_END);
int num=ftell();
—>num就是文件大小
<5>关闭文件
int fclose(FILE *stream); //fopen的返回值