sysIO 文件操作

sysIO 文件操作

打开文件

头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型
int open(const char *pathname, int flags);
参数说明
  • pathname:表示文件路径。
  • flags:表示标志位,有以下几种选项:
    • O_RDONLY:表示只读
    • O_WRONLY:表示只写
    • O_RDWR:表示可读可写
    • O_APPEND:表示追加
    • O_CREAT:表示创建
    • O_TRUNC:表示清空
    • O_NONBLOCK:表示取消阻塞标志位
返回值
  • 成功:返回未使用的最小文件描述符,非负正数(0 ~ 1024)
  • 失败:返回 -1

计算机识别文件的唯一标识是文件索引号或者inode节点号。

另一种打开文件的方式
int open(const char *pathname, int flags, mode_t mode);

第三个参数:mode_t mode

  • mode:当创建新文件时,这个参数用于指定新文件的权限位。它是一个位掩码,通常使用以下宏来设置:
    • S_IRUSR0444:用户读权限。
    • S_IWUSR0222:用户写权限。
    • S_IXUSR0111:用户执行权限。
    • S_IRGRP:组读权限。
    • S_IWGRP:组写权限。
    • S_IXGRP:组执行权限。
    • S_IROTH:其他用户读权限。
    • S_IWOTH:其他用户写权限。
    • S_IXOTH:其他用户执行权限。
创建文件并打开
int creat(const char *pathname, mode_t mode); // 默认:O_CREAT | O_WRONLY | O_TRUNC 
umask

umask:默认权限

  • file = 666 - umask
  • dir = 777 - umask
mode & ~umask // 0022

设定umask

mode_t umask(mode_t mask);

关闭文件

函数原型
int close(int fd);

读文件

函数原型
ssize_t read(int fd, void *buf, size_t count);
参数说明
  • fd:表示文件描述符。
  • buf:表示获取数据的空间地址。
  • count:表示空间大小。
返回值
  • 成功:返回获取的字符个数。
  • 失败:返回 -1

写数据

函数原型
ssize_t write(int fd, const void *buf, size_t count);
参数说明
  • fd:表示文件描述符。
  • buf:表示要写入的数据的地址。
  • count:表示要写入的数据的大小。

输出缓冲区

  • write:无缓冲函数
  • printf:行缓冲函数
  • fprintf
  • snprintf
  • fwrite:满缓冲函数

lseek

函数原型
off_t lseek(int fildes, off_t offset, int whence);
参数说明
  • 第一个参数:表示文件描述符 open
  • 第二个参数:表示偏移量
  • 第三个参数:表示偏移位置
    • SEEK_SET:从文件开头开始偏移
    • SEEK_CUR:从当前位置开始偏移
    • SEEK_END:从文件末尾开始偏移
返回值
  • 成功:表示从文件开头偏移到指定的位置
  • 失败:返回 -1

共享文件符

函数原型
int dup(int oldfd);
  • 参数:表示已打开文件描述符
int dup2(int oldfd, int newfd);
  • 参数:指定共享文件描述符的号

新的文件描述符:

  1. 未使用,则把指定文件描述符指向旧的文件描述符
  2. 使用,则先关闭原来的文件描述符,再让新的指向旧的文件描述符
实现输出重定向
int main(int argc, char *argv[])
{
    int fd1, fd2;
    char buf[1024];

    GETLINES("input a str :", buf);
    
    fd1 = open("txt", O_WRONLY | O_TRUNC | O_CREAT);
    fd2 = dup2(fd1, 1);

    printf("%s\n", buf);
    fflush(NULL);

    return 0;
}

获取文件属性多功能函数

函数原型
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
参数说明
  • 第一个参数:文件描述符
  • 第二个参数:表示指令
    • F_DUPFD:表示复制文件描述符 //要类似于dup2时要手动close()原来的文件描述符
    • F_GETFL:表示获取文件标志位
    • F_SETFL:表示设置文件状态标志位
  • 第三个参数:表示对指令补充
返回值
  • 失败:返回 -1

示例:

flag = fcntl(fd, F_GETFL);
flag |= O_APPEND;
flag = fcntl(fd, F_SETFL, flag);

设备类控制函数

函数原型
int ioctl(int d, int request, ...);
参数说明
  • 第一个参数:表示文件描述符
  • 第二个参数:表示指令
  • ...:表示对命令补充
返回值
  • 成功:返回 0
  • 失败:返回 -1

示例结构体:

struct winsize {
    unsigned short ws_row;    // 表示行
    unsigned short ws_col;    // 表示列
    unsigned short ws_xpixel; // 行像素
    unsigned short ws_ypixel; // 列像素
};

示例:

int main(int argc, char *argv[])
{
    int ret;
    struct winsize win = {};

    // 获取显示器像素或者行和列
    ret = ioctl(1, TIOCGWINSZ, &win);
    ERRP(ret == -1, ioctl, goto ERR1);

    printf("row : %d col : %d\n", win.ws_row, win.ws_col);
    printf("x : %d y : %d\n", win.ws_xpixel, win.ws_ypixel);

    system("clear");
    printf("\033[%d;%dHname : ", win.ws_row / 2, win.ws_col / 2);

    getchar();
    return 0;
ERR1:
    return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值