博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

04文件与IO

Posted on 2015-03-23 00:09  勇敢的鑫  阅读(193)  评论(0编辑  收藏  举报

文件系统调用:

open、close、create、read、write

open:

int open(const char* path, int flags)

path:要打开的文件的路径

flags:打开的模式

执行结果:成功返回文件描述符,失败返回-1。

 

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

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

//普通的宏定义写法,多条语句用逗号表达式。
//#define ERR_EXIT(m) (perror(m), exit(EXIT_FAILURE))

//这种宏定义的写法更为专业,工作中都是用这种
#define ERR_EXIT(m) \
    do \
    { \
        perror(m); \
        exit(EXIT_FAILURE); \
    } while(0)

int main(void)
{
    int fd;
    fd = open("test.txt", O_RDONLY);
/*
    if (fd == -1)
    {
        fprintf(stderr, "open error with errno=%d %s\n", errno, strerror(errno));
        exit(EXIT_FAILURE);
    }
*/
/*
    if (fd == -1)
    {
        perror("open error");
        exit(EXIT_FAILURE);
    }
*/
    if (fd == -1)
        ERR_EXIT("open error");

    printf("open succ\n");
    return 0;
}

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

path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
mode:  用来规定对该文件的所有者,文件的用户组及系           统中其他用户的访问权限

  打开成功,返回文件描述符;

  打开失败,返回-1

打开方式

描述

O_RDONLY

打开一个供读取的文件

O_WRONLY

打开一个供写入的文件

O_RDWR

打开一个可供读写的文件

O_APPEND

写入的所有数据将被追加到文件的末尾

O_CREAT

打开文件,如果文件不存在则建立文件

O_EXCL

如果已经置O_CREAT且文件存在,则强制open()失败

O_TRUNC

在open()时,将文件的内容清空

其中注意打开的文件的权限不是mode而是mode&^umask。

自己可以用umask命令查看当前的umask值,在程序中也可以用umask()来指定umask的值,例如:umask(0)。

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

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>


#define ERR_EXIT(m) \
	do \
	{ \
		perror(m); \
		exit(EXIT_FAILURE); \
	} while(0)

int main(void)
{
	umask(0);
	int fd;
	fd = open("test.txt", O_WRONLY | O_CREAT | O_EXCL, 0666);
	if (fd == -1)
		ERR_EXIT("open error");

	printf("open succ\n");
	return 0;
}

  权限可以用数字的形式也可以用下面这种,不过数字更直观一点。

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

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define ERR_EXIT(m) \
	do \
	{ \
		perror(m); \
		exit(EXIT_FAILURE); \
	} while(0)

int main(void)
{
	umask(0);   //在程序中自己指定umask值
	int fd;
	fd = open("test2.txt", O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
	if (fd == -1)
		ERR_EXIT("open error");

	printf("open succ\n");
	close(fd);    //养成好习惯不用了就关闭掉
	return 0;
}

  

可以利用按位逻辑加(bitwise-OR)(|)对打开方式的标志值进行组合。

  如打开一个新文件:

  #define NEWFILE (O_WRONLY|O_CREAT|O_TRUNC)

对访问权限位进行访问所用到的标识符,均可以通过

  #include <sys/stat.h> 访问到,同样可以通过|运算来对访问权限进行组合

  #define MODE755      (S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)