操作系统提供的API
打开open 读写write/read 光标定位 lseek 关闭close
Open 的返回值 是文件描述符RDWR
open("./文件名",0_RDWR);
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
int creat(const char *pathname,mode_t mode);
文件的权限:4.可读r 2.可写w 1.执行x 7可读可写可执行
1.文件打开及创建(open函数和creat函数)
Open 的返回值 是文件描述符RDWR
touch+文件名 创建文件夹
①open 函数用于打开和创建文件
int open(const char *path, int access)
int open(const char *path, int access,int mode)
返回值:成功则返回文件描述符,否则返回 -1
access 用于指定文件的打开/创建模式,宏定义和含义如下:
O_RDONLY 1 只读打开
O_WRONLY 2 只写打开
O_RDWR 4 读写打开
————————————————
还可选择以下模式与以上3种基本模式相与:
O_APPEND 每次写操作都写入文件的末尾(防止再次写入文件内容被覆盖)
(int open("./file1",O_RDWR|O_APPEND);)
如不加append,文件里再次写入后,之前写入内容可能被覆盖
fd = open ();
O_CREAT 如果指定文件不存在,则创建这个文件
fd=open("./file",O_RDWR | O_CREAT |O_EXCL,0600);以只读只写 打开file,若不存在创建它,若存在返回-1
O_EXCL 如果要创建的文件已存在,则返回 -1(或打开文件失败),并且修改errno的值
O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
int main(){
①直接创建: int fd;// file describetion文件描述符,非负数
fd = open("./file1",o_RDWR);
或者 fd = creat("./home/yzl/file",S_IRWXU);
②若创建文件失败,后缀
if(fd == -1){
printf("open file failed\n");
fd = open("./file",O_RDWR | O_CREAT,0600);//0600新建文件权限 6 = 4+ 2 可读可写
}
printf("fd = %d",fd);
return 0;
}
②creat函数与open相似
create函数也能打开一个文件,如果文件不存在,则创建它。和open一样,creat也在调用成功后返回一个文件描述符,如果失败,则设置errno变量并返回-1.
S_IREAD 4 可读
S_IWRITE 2 可写
S_IXUXR 1 可执行
S_IRWXU 7 可读、可写、可执行
creat的原型为:
int creat (const char *pathname,mode_t mode);
他等价于:
open(pathname,O_CREAT | O_TRUNC | O_WRONLY,mode);
2.文件写入操作编程(write函数)
补充:系统自带的几个(文件描述符)标准输入标准输出
0 1 2
标准输入 标准输出 标准错误
char buf{128};
int n_read=read(0,buf,5);//标准输入文件描述符0,从键盘读取输入五个字节到buf里
int n_write=write(1,buf,strlen(read));//标准输出文件描述符1,
Write函数:
将缓冲区 *buf的数据写入 count个数据进入fd
原型:ssize_t write(int fd, const void *buf, size_t count);
返回值 写入的个数(写多少字节返回多少字节), 失败返回-1
用到2个指令// 写入失败 -1
写入:write(int fd,const void *buf,size t_count);
例如:write(fd,buf,strlen(buf)); 往fd里写入一个buf (缓存),需char *buf="abcdefghi";
关闭 close(int fd);
int n_write=write(fd,buf,strlen(buf));
if(n_write! =-1){
printf("write %d bute to file\n",n_write);
}
3.文件的读取(read函数)
函数原型://ssize_t read(int fd,void *buf,size_t count);
返回值 写入的个数(写多少字节返回多少字节), 失败返回-1
char *bufRead;
bufRead=(char *)malloc(sizeof(char)*n_write);
int n_read = read(fd,readBuf,n_write);
printf("read %d 数据,context内容 :%s\n",n_write,readBuf);内容放到readBuf里
4.文件光标位置(lseek函数)
(对文件操作,操作完光标一般在文件末尾,若需要读取内容,就需要将光标移到最前)
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
(文件描述符,偏移值,固定点的位置)
sleek返回值是 偏移值(利用此计算文件大小,巧)
SEEK_SET
The file offset is set to offset bytes.光标首位置
SEEK_CUR
The file offset is set to its current location plus offset
bytes.
SEEK_END
The file offset is set to the size of the file plus offset
bytes.用此获取文件大小例如:
int sizefile ==lseek(fd,0,SEEK_END);即可输出大小
直接在需要读取前加上lseek即可.
打开open
读写write/read
光标定位 lseek
关闭close
补充:动态文件和静态文件
1.文件平时存放在块设备中的文件系统文件中---静态文件
2.平时用open打开一个文件,linux内核操作包括:内核在进程中内存中动态文件和块设备文件中的的静态文件就不同步了,当我们close动态文件时,close内部内核将内存中动态文件的内容去同步(更新)到块设备中的静态文件里
3.强调注意点:我们对文件操作时,一定要先打开文件,打开成功之后才能操作,如果打开失败就不用进行后边操作,最后读写完成后一定给要关闭文件,否则造成文件损坏。
4.在linux中操作一个文件,一般是先open一个文件,得到文件描述符,然后对文件进行读写操作(或其他操作),最后是close关闭文件。
块设备本身读写不灵活,是按照块读写的,而内存是按字节单位操作,而且可以随机操作,很灵活
五、总结open与fopen的区别
总结open与fopen的区别 - NickyYe - 博客园
六、文件其他函数操作
fopen fwrite fread fseek fclose
fgetc fputc feof