文章目录
- 🗂️前言
- 📄ref
- 📄访问标记
- 🗃️文件访问标记
- 🗂️Code
- 📄demo
- 📄分点讲解
- 🗃️打开/关闭
- 🗃️写
- 🗃️读
- 🗂️END
- 🌟关注我
🗂️前言
📄ref
- POSIX (Guile Reference Manual) (gnu.org)
- Top (The GNU C Library)
- POSIX Certification home (opengroup.org)
- The Single UNIX Specification, Version 2 (opengroup.org)
📄访问标记
🗃️文件访问标记
open (opengroup.org)
这里选取一些常用和重要的描述
文件模式 | 描述 |
---|---|
访问模式 | |
O_EXEC | 打开仅执行(非目录文件) |
O_RDONLY | 打开仅读取 |
O_RDWR | 打开读写 |
O_SEARCH | 打开目录仅搜索 |
O_WRONLY | 打开仅写入 |
状态标志 | |
O_APPEND | 再每次写入操作之前将文件偏移设置为文件末尾处 |
O_TRUNC | 将文件长度截断为0 |
O_CREAT | 创建文件 |
O_EXCL | 如果设置过O_CREAT且文件存在,则文件打开失败 |
访问权限 | |
S_IRUSR | 文件属主的读权限位 |
S_IWUSR | 文件属主的写权限位 |
S_IRGRP | 文件属组的写权限位 |
S_IROTH | 其他用户的读权限位 |
🗂️Code
📄demo
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
void file_write(const char* file_path) {
int oflag = O_WRONLY | O_CREAT | O_TRUNC;
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
int fd = open(file_path, oflag, mode);
if (fd == -1) {
perror("Error opening file");
return;
}
int ret = 0;
char name[] = "Hello, World!\n";
char url[] = "https://space.bilibili.com/8172252\n";
ret = write(fd, name, strlen(name));
if (ret == -1) {
perror("Error writing to file");
goto end;
}
ret = write(fd, url, strlen(url));
if (ret == -1) {
perror("Error writing to file");
goto end;
}
end:
close(fd);
}
void file_read(const char* file_path) {
int fd = open(file_path, O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return;
}
int ret = 0;
char buf[1024];
while ((ret = read(fd, buf, sizeof(buf))) > 0) {
write(STDOUT_FILENO, buf, ret);
}
if (ret == -1) {
perror("Error reading from file");
goto end;
}
end:
close(fd);
}
int main() {
const char* file_path = "example.txt";
file_write(file_path);
file_read(file_path);
}
📄分点讲解
说白了,这就是最标准的 POSIX 的对文件描述符fd的操作方式。
淡然posix下的文件操作和读写不知这简单的几种,但掌握最基本的以下几种是必备的。
🗃️打开/关闭
int oflag = O_WRONLY | O_CREAT | O_TRUNC;
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
int fd = open(file_path, oflag, mode);
close(fd);
🗃️写
if ((ret = write(fd, buf, sizeof(buf))) < 0) {
perror("Error writing to file");
}
🗃️读
while ((ret = read(fd, buf, sizeof(buf))) > 0) {
write(STDOUT_FILENO, buf, ret);
}
🗂️END
🌟关注我
关注我,学习更多C/C++,算法,计算机知识
B站:
👨💻主页:天赐细莲 bilibili