1.access()函数
access()函数根据参数中给定的模式(位的形式)来检查调用进程对文件的权限。
头文件:<unistd.h>
函数原型:
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 <stdio.h>
#include <unistd.h>
#include <errno.h> //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数组缓冲区中。
头文件:<stdio.h>
函数原型:
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 <stdio.h>
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函数用来打开或者创建新的文件。
头文件:<fcntl.h>
函数原型:
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 <stdio.h>
#include <fcntl.h>
#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()函数用来向文件中写数据。
头文件:<unistd.h>
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
函数参数:
- int fd:文件描述符;
- const void *buf:待写入数据缓冲区;
- size_t count:写入字符;
返回值:
写入成功,将返回写入的字节数,否则返回-1,并将失败原因设置给errno。
综合示例
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
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 C编程中四个重要的文件操作函数:access()用于检查文件权限,snprintf()用于格式化输出到缓冲区,open()用于打开或创建文件,write()用于向文件写入数据。每个函数的头文件、参数、返回值和示例代码都有清晰的说明。

297

被折叠的 条评论
为什么被折叠?



