基于文件描述符的文件操作(二):文件打开关闭与读写

By AverageJoeWang
 标签:

一.open/close/creat函数

1.1.open,close,creat原型

#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);//文件名  打开方式  权限
int close(int fd);
int creat(const char *pathname, mode_t mode);    //文件名  权限   //现在已经不常用了,creat函数等价于
open(const char *pathname,O_CREAT|O_TRUNC|O_WRONLY,mode_t mode);
  • 说明:
  • open()函数出错时返回-1
  • flags和mode都是一组掩码的合成值,flags表示打开或创建的方式,mode表示文件的访问权限。
  • flags选项有
掩码 含义
O_RDONLY 以只读的方式打开
O_WRONLY 以只写的方式打开
O_RDWR 以读写的方式打开
O_CREAT 如果文件不存在,则创建文件
O_EXCL 仅与O_CREAT连用,如果文件已存在,则强制open失败
O_TRUNC 如果文件存在,将文件的长度截至0
O_APPEND 已追加的方式打开文件,每次调用write时,文件指针自动先移到文件尾,用于多进程写同一个文件的情况。
O_NONBLOCK 非阻塞方式打开,无论有无数据读取或等待,都会立即返回进程之中。
O_NODELAY 非阻塞方式打开
O_SYNC 同步打开文件,只有在数据被真正写入物理设备设备后才返回

1.2.open,close例子

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
using std::cout;
using std::endl;

int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        printf("error args");
        return -1;
    }

    int fd;
    fd = open(argv[1], O_RDWR|O_CREAT);//fd是文件描述符
    if(-1 == fd)
    {
        perror("open fail\n");
        return -1;
    }else
        printf("open success !\n");
    close(fd);//close用法
    return 0;
}

二.write,read函数

2.1.原型

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);//文件描述词  缓冲区  长度
ssize_t write(int fd, const void *buf, size_t count);
  • 说明

对于read和write函数,出错返回-1,读取完了之后,返回0, 其他情况返回读写的个数。

2.2.例子

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <strings.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
using std::cout;
using std::endl;

int main(int argc, char * argv[])
{
    int fd;
    fd = open("./a.txt", O_RDWR|O_CREAT);
    if(-1 == fd)
    {
        perror("open fail\n");
        return -1;
    }

    int ret;
    char buf[128];
    bzero(buf, sizeof(buf));
    ret = read(fd, buf, sizeof(buf));//文件的读操作
    if(-1 == ret)
    {
        perror("read fail\n");
        return -1;
    }else cout << buf << endl;
    close(fd);

    //文件的写
    int fd2 = open("./b.txt", O_RDWR|O_CREAT);
    if(-1 == fd2)
    {
        perror("open2 fail\n");
        return -1;
    }

    bzero(buf, sizeof(buf));
    strcpy(buf, "how are you?");

    ret = write(fd2, buf, sizeof(buf));
    if(-1 == ret)
    {
        perror("write fail\n");
        return -1;
    }else
        cout << "write success!" << endl;
    close(fd2);
    return 0;
}