提示:学完本章内容后,你将掌握文件操作的基本知识
前言
提示:linux系统通过了许多内核功能的API,程序设计者可以通过调用这些API实现系统的某些功能:
例如:支持对文件完整操作的open、read、write和close函数,以及支持网络服务功能的socket等。
提示:以下是本篇文章所需的API,下面案例可供参考
一、支持文件操作API汇总
- int creat(const char *pathname, mode_t mode);
- int open(const char *pathname, int flags, mode_t mode);
- ssize_t read(int fd, void *buf, size_t count);
- ssize_t write(int fd, const void *buf, size_t count);
- off_t lseek(int fd, off_t offset, int whence);
- int close(int fd);
二、文件使用步骤
1.creat()
以mode权限创建pathname文件,与open区别在于创建后并不打开文件,使用不需要close文件。
代码如下(示例):
#include <unistd.h>
//int creat(const char *pathname, mode_t mode);
char *pathname = "./a.txt" //文件路径可以是相对路径或绝对路径
int status = creat(pathname,0600); //以可读可写权限创建a.txt文件并返回创建状态
2.open()
以flages参数指定的权限打开pathname指向的文件,并返回int型文件描述符值。参数mode只有创建文件时使用,为文件赋予权限属性。
代码如下(示例):
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//int open(const char *pathname, int flags, mode_t mode)
char *pathname = "./a.txt" //可以相对路径或绝对路径
int fd = open(pathname,O_CREAT|O_RDWR,0600); //以可读可写权限打开a.txt后返回文件描述符,若不存在,以0600权限创建a.txt
/*参数flags是打开文件的方式:
1.O_RDONLY:以只读权限打开文件
2.O_WRONLY:以只写权限打开文件
3.O_RDWR:以读写权限打开文件
4.O_APPEND:以追加方式打开权限,向文件写入时不会覆盖原内容
5.O_CREAT:若文件不存在则创建文件并打开,使用该权限必须提供mode值
6.O_EXCL:打开已经存在的文件返回-1并退出
7.O_TRUNC:打开的文件已经存在,以只读或只写方式开文件会删除所有内容
*/
/*参数mode用于给将被创建的pathname赋予权限,当使用O_CREAT时该参数不可省略,以0600值为例:
1.0表示后面的600为八进制值
2.6表示图第1位列的4和2的权限总和 故:所有拥有者有读、写权限
3.0表示图第2位列,既不是4,也不是2或1的权限,表示不指定当前用户所在群组对文件的使用权限
4.0表示图第3位列,既不是4,也不是2或1的权限,表示不指定其它用户对文件的使用权限
*/
3.read()
从fd指向的文件中读取count个的字节存储到buf缓冲区后返回实际读取的字节总数,光标位置会对应的向右偏移count个字节。
代码如下(示例):
#include <unistd.h>
//ssize_t read(int fd, void *buf, size_t count)
char *buf = (char*)malloc(count); //在内存堆栈区中申请count个字节存储单元并将其单元的首地址存储在buf指针中
int realcount = read(fd,buf,strlen(buf)); //将文件描述符fd指向的文件中读取buf个长度的字节并存储到buf指向的单元空间后realcount接收实际读取的字节总数
4.write()
将buf指向单元的count个字节向fd指向的文件中写入,注意文件被写入时光标位置要设置在内容的尾部,否则光标所处的内容将被buf内容覆盖count个字节。
代码如下(示例):
#include <unistd.h>
//ssize_t write(int fd, const void *buf, size_t count);
char *buf = "Hello World!"; //定义一个指向常量区字符串单元首地址
int realcount = write(fd,buf,strlen(buf)); //将这个字符串写入fd指向的文件中,realcount接受实际写入的字节总数
5.lseek()
将fd指向的文件当前光标位置设置在whence位置,再向左或右偏移offset个字节,并返回实际光标偏移总量,可以用偏移量计算出文件大小。
代码如下(示例):
#include <sys/types.h>
#include <unistd.h>
//off_t lseek(int fd, off_t offset, int whence);
int realcount = lseek(fd,0,SEEK_SET); //将文件光标指向开头并返回总偏移字节数
6.close()
关闭fd指向的文件。
代码如下(示例):
#include <unistd.h>
//int close(int fd);
close(fd);
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本章主要讲解文件类的API使用方法,在Linux中,文件被打开后是以文件描述符的方式来表示文件的,所以除了打开或创建文件外,其余操作都是通过文件描述符方式操作文件。