文件IO
5个函数:打开、关闭、读写、定位操作
- 概念:由系统提供的一组用于输入输出的函数接口
- 特点:
- 没有缓冲机制,每次访问都要经过系统调用(系统向上提供的一组接口)
- 围绕文件描述符进行操作,文件描述符是非负整数(>=0),依次加1进行分配
- 文件IO默认打开三个描述符:0(标准输入)、1(标准输出)、2(标准出错)
- 可以操作-、b、c、p、s、l
补充:man 数字 函数名 1-9,1:命令 2:系统调用 3:库函数
打开文件
头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
功能:打开文件
参数:pathname:文件路径名
flags:打开文件的方式
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:可读可写
O_CREAT:创建
O_TRUNC:清空
O_APPEND:追加
返回值:成功:文件描述符
失败:-1
当第二个参数中有O_CREAT选项时,需要给open函数传递第三个参数,指定创建文件的权限 int open(const char *pathname, int flags, mode_t mode);
创建出来的文件权限为指定权限值&(~umask)
标准IO和文件IO打开文件方式的对比
标准IO | 文件IO |
r | O_RDONLY |
r+ | O_RDWR |
w | O_WRONLY|O_CREAT|O_TRUNC, 0666 |
w+ | O_RDWR|O_CREAT|O_TRUNC, 0666 |
a | O_WRONLY|O_CREAT|O_APPEND,0666 |
a+ | O_RDWR|O_CREAT|O_APPEND,0666 |
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main( 懒得写了 )
{
int fd;
fd = open ("a.c",O_RDWR)//文件名,打开方式
if (fd < 0)//判断是否打开
{
perror ("fd open error");
return -1;
}
printf("open seccess\n");
return 0;
}
关闭文件
int close(int fd);
功能:关闭文件
参数:fd:文件描述符
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main( 懒得写了 )
{
int fd;
fd = open ("a.c",O_RDWR)//文件名,打开方式
if (fd < 0)//判断是否打开
{
perror ("fd open error");
return -1;
}
close(fd);//关闭文件
return 0;
}
读写文件
ssize_t read(int fd, void *buf, size_t count);
功能:从一个已打开的可读文件中读取数据
参数:fd 文件描述符
buf 存放位置
count 期望的个数
返回值:成功:实际读到的个数
返回-1:表示出错,并设置errno号
返回0:表示读到文件结尾
ssize_t write(int fd, const void *buf, size_t count);
功能:向指定文件描述符中,写入 count个字节的数据。
参数:fd 文件描述符
buf 要写的内容
count 期望值
返回值:成功:实际写入数据的个数
失败 : -1
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main( 懒得写了 )
{
int fd;
char buf[32]="";
fd = open ("a.c",O_RDWR)//文件名,打开方式
if (fd < 0)//判断是否打开
{
perror ("fd open error");
return -1;
}
read(fd,buf,32);
printf("%s",buf);
write(fd,buf,32);
close(fd);//关闭文件
}
文件定位操作
off_t lseek(int fd, off_t offset, int whence);
功能:设定文件的偏移位置
参数:fd:文件描述符
offset偏移量
正数:向文件结尾位置移动
负数:向文件开始位置
whence 相对位置
SEEK_SET 开始位置
SEEK_CUR 当前位置
SEEK_END 结尾位置
返回值:成功:文件的当前位置
失败:-1
练习:向文件中第 10 位置处写一个字符,在文件此时的位置,后 20个位置处,写一行字符串hello进去,求此时文件的长度。
标准IO和文件IO区别
标准IO | 文件IO | |
概念 | c库中定义的一组输入输出的函数 | 系统提供一组输入输出的函数 |
特点 |
stdin、stdout、stderr
|
0、1、2
|
函数接口 |
|
|
cat \ head \ tail \ wc -l \ cp \ mv \ ls \ ls -a \ ls -l file.txt
练习:用文件IO实现cp功能
把a.c 内容复制到 b.c