文件IO调用接口 open close read write

open

linux下,open函数用于打开和创建文件。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname,int flags,mode_t mode )

pathname:要打开或创建的目标文件。(可带可不带路径,如果不带默认缺省为当前路径)

flags:用来控制打开文件的模式(打开文件时,可传入多个参数选项,用下面的一个或多个常量或运算,构成flags)

mode : 用来设置创建文件的权限(rwx)。当flags中带有O_CREAT时才有效。

flags参数

  • O_RDONLY: 只读打开
  • O_WRONLY:只写模式
  • O_RDWR:可读可写模式

上面三种模式在flags参数必须有一种出现且只能有一个
以下参数是可选的

  • O_APPEND:追加写,以后每次写文件时都会先将当前文件偏移量设置到文件末尾,但是读文件时时不影响的
  • O_CREAT:如果文件不存在则创建
    == 需要mode选项来指明新文件的权限==
  • O_EXCL:要打开的文件如果存在则出错,必须要和O_CREAT参数一起使用
  • O_TRUNC:打开文件的同时将文件中的内容清除
  • O_NOCTTY:如果打开的文件是终端设备,则不将此设备设置为进程的控制终端
  • O_NONBLOCK:如果打开的文件是一个管道、一个块设备文件或一个字符设备文件,则后续的I/O操作均设置为非阻塞方式
  • O_SYNC:使每次write都等到物理I/O操作完成

以上所有参数均为常量,二进制位上有缺只有一位为1,且位置不同

返回值

  • 打开成功:返回新文件的文件描述符
  • 打开失败:返回-1,并修改erron(将错误信息位到erron中)

erron :这是一个系统的错误全局变量,如果系统调用当中出错了,内部会自动往里面置一个错误的数字,你可以通过perror,strerror获取错误的信息

如果文件不存在需要open创建,第三个参数表示创建文件的默认权限,否则,使用两个参数的open

write read close lseek

  • write
#include <unistd.h>

ssize_t write(int fd ,void *buf, size_t count )
fd:文件描述符
buf:缓冲区首地址
count: 期望写入字节数

返回值:实际写入字节数  ,出错返回-1

  • read
功能描述: 从文件读取数据。
所需头文件: #include <unistd.h>

函数原型:ssize_t read(int fd, void *buf, size_t count);

参数:  
fd: 将要读取数据的文件描述词。
buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。
count: 表示调用一次read操作,期望读多少数量的字符。

返回值:返回所读取的字节数;0(读到EOF);-1(出错)。
  • close
功能描述:用于关闭一个被打开的的文件

所需头文件: #include <unistd.h>

函数原型:int close(int fd)

参数:fd文件描述符

函数返回值:0成功,-1出错

  • lseek
功能描述: 用于在指定的文件描述符中将将文件指针定位到相应位置。
所需头文件: #include <unistd.h>,#include <sys/types.h>

函数原型:off_t lseek(int fd, off_t offset,int whence);

参数:

fd;文件描述符

offset:偏移量,每一个读写操作所需要移动的距离,单位是字节,可正可负(向前移,向后移)

whence:

SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小

SEEK_CUR:当前位置为指针的位置,新位置为当前位置加上偏移量

SEEK_END:当前位置为文件的结尾,新位置为文件大小加上偏移量的大小

返回值:

成功:返回当前位移

失败:返回-1
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    umask(0);
    //文件创建时存在默认权限文件掩码,umask系统调用其默认缺省为0
    int fd=open("myfile",O_WRONLY|O_CREATE,0644);
    //打开一个不存在的文件并写
    //当使用flags的多个参数时使用或
    //要决定新文件的权限
    //int  fd=open("myfile",O_RDONLY);
    if(fd<0)  //fd 为文件描述符
    {
        perror("open");
        return 1;
    }
    
    int count=5;
    const char *msg="hello\n";
    int len=strlen(msg);
    char buf[1024];
    while(count--)
    {
    write(fd,msg,len);//fd:文件描述符  msg:缓冲区首地址  len  :期望写入的长度  返回值:实际写入的长度
    //向文件中写入字符串时不带‘\0’
    // read(fd,buf,strlen(msg));
    }
    
    close(fd);//关闭文件描述符,关闭文件
    return 0;
}

c库中的fwrite fread fopen fclose 等都相当于是对系统调用的封装

猜你喜欢

转载自blog.csdn.net/M_jianjianjiao/article/details/83241985