概述
本片文章将会主要介绍四个IO函数:开关读写
open函数
- open 函数的输入参数是
open(char* ,flag ,[mode])
- 第一个参数表示的是打开文件的路径文件名
- 第二个参数表示的是打开的方式,见下表
打开方式 描述 O_RDONLY 只读 O_WRONLY 只写 O_RDWR 读写 O_CREAT 创建 O_EXCL 文件不存在则创建(可以防止重复创建) O_TRUNC 擦除文件内容再打开 O_APPEND 追加方式打开(不会清除文件内容) - 第三个参数表示的是文件的权限,但是注意
输入权限要经过umask掩码掩盖
- 返回值:文件创建失败返回
-1
,创建成功返回文件ID(文件描述符)
通过open函数来实现touch
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
int main(int argc ,char *agrv[]){int fd;fd = open("./file_been_touched",O_CREAT|O_EXCL,0777);if(fd<0){printf("failed");return -1;}else{printf("sucess");return 0;}
}
write函数
- write函数的输入参数有三个:
写到哪里去,写什么,写多少
- 返回值是实际上写的字节数
- 程序示例
char buf[]="this is kafen !"; int fd2 = write(fd,buf,sizeof(buf)); printf("====%d===\n",fd2);
read函数和lseek函数
-
读函数有三个参数:
从哪里读,读到哪里去,读多少
,read(fd,buf,size)
-
当直接去读文件中的内容的时候,由于文件指针的偏移,一般情况下是读不到内容的,需要借助
lseek
函数 -
lseek函数有3个参数
文件指针,偏移量,当前位置
-
lseek成功的返回值是
文件的当前位置
当前位置参数 描述 SEEK_SET 当前为文件开头 SEEK_CUR 当前为文件指针 SEEK_END 当前为文件结尾
使用文件操作函数实现cp命令
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
#include "string.h"int main(int argc,char *argv[]){int rd_fd,wr_fd;char read_buf[128]={0};int rd_ret=0;if(argc<3){printf("please input src file and des file\n");return -1;}rd_fd=open(argv[1],O_RDONLY); //打开第一个输入参数文件,模式为只读if(rd_fd<0){printf("open failure");return -2;}printf("open success\n");wr_fd=open(argv[2],O_WRONLY);//打开第二个输入参数文件,模式为致只写if(wr_fd<0){printf("open failure");return -3;}printf("open success");while(1){rd_ret=read(rd_fd,read_buf,128); //读src文件中的内容,每次读128个if(rd_ret<128){ //剩下的字符小于128个,证明是最后一次break;} write(wr_fd,read_buf,rd_ret);//把缓存中的字符拷给des文件}memset(read_buf,0,128);//清除缓存中的文件write(wr_fd,read_buf,rd_ret); //写最后的不足128个字符的数据close(rd_fd);//关闭src文件close(wr_fd);//关闭des文件
}
diff函数
- 比较文件之间的差异
diff file1 file2
文件IO和标准IO
标准IO中的相关函数不仅可以读写普通文件,也还可以向标准输入输出中读或写
三个buffer
关于printf
- printf遇到
\n
时会将全体缓存的内容谢翱内核中,即调用了系统调用函数 - 库缓存写满时,会把lib buffer的内容写到kernel buf