int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
函数解读:
1.pathname是一个文件描述符,里面的参数是你想要打开或者创建的文件
形式一般为./文件名
。
flag是文件属性 O_RDONLY, O_WRONLY, O_RDWR.
其中代表文件只读,只写,可读可写。这三个属性只能选择其中一种。但可以附加如下属性O_CLOEXEC, O_CREAT, O_DIRECTORY, O_EXCL, O_NOCTTY, O_NOFOLLOW, O_TMPFILE, O_TRUNC.
不过常用属性为
O_CREAT 如果你写入的pathname并不存在,系统会帮你创建
注意:O_CREAT一旦被使用就需要写入mode_t mode
参数,一般为文件权限
参数为00400为仅可读
参数为00200为仅可写
参数为00100为可执行
可读可写可执行为00700
O_EXCL
如果同时指定了O_CREAT,如果文件已存在则出错
O_APPEND
每次写入文件的东西加载到文件末尾
O_TRUNC
当打开一个文件写入时,就会清理掉文件内之前残留的东西,重新开始写入
open成功执行后会返回一个较小的非负整数,来作为文件的索引
后续的相关操作close,write,read都需要这个返回值来操作对应文件
ssize_t write(int fd, const void *buf, size_t count);
返回值为整形,函数的返回值为写入的字节数
fd为open产生的数值
buf为文字缓冲区,里面存放你想要写入的数据,count为写入文字的字数
ssize_t read为整形,是读取的类型数
buf为缓冲区,将读取的文字存放的地方
count为读取的字节个数
#include
#include
#include
#include
#include
#include
#include
int main()
{
char *buf;//写入缓冲区
buf = "csdn";//确定写入的字符
int fd;//文件描述符
fd = open("./file1", O_RDWR|O_CREAT,00600);//以可读可写方式打开
if(fd<0){
printf("false\n");
perror("why\n");
}else{
printf("success\n");
}
int n_write = write(fd,buf,strlen(buf));写入
close(fd);
}
#include
#include
#include
#include
#include
#include
#include
int main()
{
char *buf;//读入缓冲区
buf = (char*)malloc(sizeof(char)*8);//开辟一个空间
int fd;
fd = open("./file1", O_RDWR|O_CREAT,00600);//打开文件描述符
if(fd<0){
printf("false\n");
perror("why\n");
}else{
printf("success\n");
}
int n_read = read(fd,buf,8);//读入缓冲区
close(fd);
printf("%s %d",buf,n_read);
}
当我们写入时光标会随之移动,写入完成后光标会在文件的末尾跳动。在当我们接着读取文件操作时,已经无法读取到了(读取会读光标后的文件)。所以在读取文件时,对光标的控制是非常重要的
off_t lseek(int fd, off_t offset, int whence);
fd为文件描述符
offset:偏移字节数
whence:文件所在位置(SEEK_SET起始位置,SEEK_CUR当前位置,SEEK_END末尾位置)
#include
#include
#include
#include
#include
#include
#include
int main()
{
char *buf;//写入文件缓冲区
buf = "hajie";//写入的文件
int fd;
fd = open("./file1", O_RDWR|O_CREAT|O_TRUNC,00600);
if(fd<0){
printf("false\n");
perror("why\n");
}else{
printf("success\n");
}
int n_write = write(fd,buf,strlen(buf));//写入文件
lseek(fd,0,SEEK_SET);//光标移动到开头
char *readbuf = malloc(sizeof(char)*n_write);//创建读取缓冲区
int n_read = read(fd, readbuf, n_write);//读取
printf("n_write = %d,n_read = %d,content:%s\n",n_write,n_read,readbuf);//打印内容
close(fd);
}
示例程序
#include
int main(int argc,char **argv)
{
printf("%d\n",argc);
printf("%s\n",argv[0]);
printf("%s\n",argv[1]);
printf("%s\n",argv[2]);
printf("%s\n",argv[3]);
}
运行结果
4
./a.out
aa
bb
cc
我们在命令框输入./a.out aa bb cc时可以看出main函数获取了四个指令,所以argc值为4
char *和char[] 意思一样,它是数组的数组,即每个数组元素都是字符数组(字符串)来保存我们输入的指令
#include
#include
#include
#include
#include
#include
int main(int argc,char **argv)
{
int fdsf;//想要复制的文件
int fddf;//复制到的目标文件
char *sharebuf=NULL;
if(argc!=3){
printf("error!");
exit(-1);
}
fdsf = open(argv[1],O_RDWR);//打开原文件
int size= lseek(fdsf,0,SEEK_END);//计算文件长度(将光标置于尾巴,返回值为现光标位置到文件开头的偏移值)
if(size<0){
perror("why\n");
}
sharebuf = (char*)malloc(sizeof(char)*size+8);
lseek(fdsf,0,SEEK_SET);//重新设置光标,防止读不到内容
int n_read = read(fdsf,sharebuf,size+8);
fddf = open(argv[2],O_RDWR|O_CREAT,00600);//打开目标文件
int n_write = write(fddf,sharebuf, size);//写入
printf("size = %d,n_read = %d,n_write = %d",size,n_read,n_write);
close(fdsf);
close(fddf);//关闭两个文件
}
~