一,标准IO和文件IO的区别
1.标准IO是库函数,是对系统调用的封装
2.文件IO是系统调用,时linux内核中的函数接口
3.标准IO是有缓存的,文件IO是没有缓存的(实时性强)
二,文件IO
1.三步操作:
打开->读/写->关闭(open - > read/write - > close )
2..打开文件:
open
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_APPEND 追加
O_ASYNC 异步IO
O_CREAT 文件不存在创建
O_TRUNC 文件存在截断(清0)
返回值:
成功返回文件描述符(很小的非负整数)
失败返回-1
新生成的文件描述符总是为尚未被使用的最小的非负整数
0: stdin
1: stdout
2: stderr
3.标准IO权限写法 文件IO的权限写法
r 只读 ----------- O_RDONLY(只读)
r+ 读写 ----------- O_RDWR(读写)
w 只写 ----------- O_WRONLY | O_CREAT | O_TRUNC,0664(只写 | 创建 | 清0)
w+ 写读 ----------- O_RDWR | O_CREAT | O_TRUNC, 0664(读写|创建|清0)
a 追加只写 ----------- O_WRONLY | O_CREAT | O_APPEND, 0664(只写|创建|追加)
a+ 追加写读 ----------- O_RDWR | O_CREAT | O_APPEND, 0664(读写|创建|追加)
注意:0664 是 起到一个权限作用 ,只要有O_CREAT 就需要添加0664.
4.关闭文件:
close
int close(int fd);
功能:
将fd对应的文件描述符关闭
5.读写:
read/write
1.write
ssize_t write(int fd, const void *buf, size_t count);
功能:
向fd对应的文件中写入buf指向的count个字节
参数:
fd:文件描述符
buf:写入数据空间首地址
count:写入的字节数
返回值:
成功返回实际写入字节数
失败返回-1
int main(void) //write用法
{int fd = 0;char tmpbuff[4096] = {"hello world"};fd = open("a.txt",O_WRONLY | O_CREAT | O_TRUNC,0664); if(fd == -1){perror("fail to open");return -1;}write(fd,tmpbuff,strlen(tmpbuff));close(fd);return 0;}
2.read
ssize_t read(int fd, void *buf, size_t count);
功能:
从文件描述符fd对应的文件中读取count个字节存放到buf开始的空间中
参数:
fd:文件描述符
buf:存放数据空间的首地址
count:想要读取数据字节数
返回值:
成功返回实际读到的字节数
失败返回-1
读到文件末尾返回0
int main(void) //read用法
{int fd = 0;char tmpbuff[4096] = {0};ssize_t nret = 0; //定义一个接收返回值的变量fd = open("a.txt",O_RDONLY); if(fd == -1) {perror("fail to open");return -1;}nret = read(fd,tmpbuff,sizeof(tmpbuff)); //nret返回值返回的是实际读到的个数printf("%ld\n",nret);printf("%s\n",tmpbuff);close(fd);return 0;}
注意:求字符串长度用sizeof,对二进制数据使用strlen
printf的字符最后没有‘\0’