[Unix] Unix C 中access(),snprintf(),open(),write()函数的使用

1.access()函数

access()函数根据参数中给定的模式(位的形式)来检查调用进程对文件的权限。

头文件:

函数原型:

int access(const char* path, int mode);

参数:

  • const char* __path:文件路径;
  • int __mode:模式,有四种:
    • R_OK:可读权限;
    • W_OK:可写权限;
    • X_OK:可执行权限;
    • F_OK:文件是否存在;

返回值:
允许返回0,否则返回-1,并设置errno来指示错误原因,errno有如下几个值:

  • EACCES:文件访问权限被拒绝;
  • ELOOP:解析路径名时符号链接太多;
  • ENAMETOOLONG:路径名称过长;
  • ENOENT:路径名中的目录不存在,或是符号链接;
  • ENOTDIR:在路径名中用作目录的组件实际上不是目录
  • EROFS:对只读文件系统上的文件请求写操作;
  • EFAULT:路径名指向可访问的地址空间之外
  • EINVAL:模式值无效;
  • EIO:出现了IO错误;
  • ENOMEM:内核空间不足;
  • ETXTBSY:对正在执行的可执行文件请求写操作;

示例:

#include 
#include 
#include  //errno所在头文件

#define FILEPATH "testfile"

int main()
{
        if (access(FILEPATH,R_OK|F_OK|X_OK) == 0) {
            printf("file exists, ready to read.\n");
        } else {
            if (errno == EACCES) {
                printf("No permission. \n");
            } else if (errno == EINVAL) {
                printf("Mode is invalid. \n");
            } else {
                printf("Other reason. \n");
            }   
        }
        return 0;
}

参考资料:https://linux.die.net/man/2/access

2.snprintf()函数

snprintf()函数用于格式化并存储一个系列的字符或者值到char数组缓冲区中。

头文件:

函数原型:

int snprintf(char *str, size_t size, const char *format, ...);

参数:

  • char *str:char 类型的缓冲区;
  • size_t size:写入的最大个数;当字符串长度大于size时,只能写size-1个字符(因为结尾为\0);
  • const char * format:格式化字符串;
  • …: 可选参数,是const char * format 的参数;

返回值:
格式化成功时,返回格式化字符串的长度,失败时,返回-1,并设置errno来指示错误原因。
示例:

#include 

int main()
{

    char buffer[10];
    const char* name = "zhangsan01234";
    int bytes;
    bytes = snprintf(buffer,sizeof(buffer),name);
    printf("buffer:%s\nbytes:%d\n",buffer,bytes);
    
    bytes = snprintf(buffer,4,"%d",123456);
    printf("new buffer:%s\nnew bytes:%d\n",buffer,bytes);
    return 0;
}
/*
$ ./test 
buffer:zhangsan0
bytes:13
new buffer:123
new bytes:6
*/

3.open()函数

open函数用来打开或者创建新的文件。

头文件:

函数原型:

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

参数:

  • const char *path:文件路径;
  • int oflag:文件访问模式,有如下几个值:
    • 必须使用参数:
      • O_RDONLY:以只读形式打开文件;
      • O_WRONLY:以只写形式打开文件;
      • O_RDWR:以读写形式打开文件;
  • 可选参数:
    • O_APPEND:以追加形式写入文件;
    • O_CREAT:如果文件不存在将创建;
    • O_EXCL:和O_CREAT一起使用时,如果文件已存在,则open失败,返回-1;
    • O_TRUNC:如果文件已存在且是以只写或读写权限打开的常规文件,则清空该文件。
  • …:仅在创建新文件时设置,用于指定文件权限,有如下几个值:
  • S_IRWXU:用户具有rwx权限;
  • S_IRUSR:用户具有r权限;

返回值:

如果打开文件成功,将返回一个新的文件描述符(非负整数),否则将返回-1,并且将失败原因设置给errno.

示例:

#include 
#include 
#define FILE "text.txt"

int main()
{
    int fd; 
    fd = open(FILE,O_RDWR|O_CREAT,S_IRWXU);
    if (fd != -1) {
        printf("Successful.\n");
    } else {
        printf("Error.\n");
    }   
    return 0;
}

4.write()函数

write()函数用来向文件中写数据。

头文件:
函数原型:

ssize_t write(int fd, const void *buf, size_t count);

函数参数:

  • int fd:文件描述符;
  • const void *buf:待写入数据缓冲区;
  • size_t count:写入字符;

返回值:
写入成功,将返回写入的字节数,否则返回-1,并将失败原因设置给errno

综合示例

#include 
#include 
#include 
#include 

const char *file = "test.txt";

int main()
{
    //先判断文件是否存在
    if (access(file,F_OK)) {
        printf("File is not exist,please creat it.\n");
    } else {
        //文件存在,以只写方式打开文件
        int fd; 
        fd = open(file,O_WRONLY|O_APPEND);
        if (fd > 0) {
            //打开文件成功,开始写入文件
            char message[40];
            char fmt_msg[10];
            printf("please enter a message:\n");
            scanf("%s",message);
            //格式化输入内容,只写入前10个字符
            snprintf(fmt_msg, sizeof(fmt_msg),message);
            //开始写入文件
            int size = write(fd,fmt_msg,sizeof(fmt_msg));  
            if (size != -1) 
                printf("write sucessful.\n");
            else 
               printf("write error, reason:%d\n",errno);    
        } else {
            printf("open failed: %d\n",errno);
        }
    }        
    return 0;
}

你可能感兴趣的:(Unix编程)