首页 > 系统相关 >IO进程----文件IO

IO进程----文件IO

时间:2024-08-08 11:26:25浏览次数:14  
标签:文件 CREAT int st ---- IO 进程 include 目录

目录

IO进程

文件IO

1.  概念

2.  特点

3.  函数

3.1.  打开文件

3.2.  关闭文件

3.3.  读写文件

read

write

3.4.  文件定位操作

文件属性获取

目录操作


IO进程

文件IO

1.  概念

在posix(可移植操作系统接口)中定义的一组输入输出的函数

2.  特点

1.  没有缓冲机制,每次操作都会经过系统调用,效率比较低

2.  围绕文件描述符进行操作,文件描述符是非负整数, 0、1、2.....

3.  默认打开三个文件描述符,0(标准输入)、1(标准输出)、2(标准错误)

4.  除目录外其他任意类型文件都可以操作

3.  函数

3.1.  打开文件

man 3 open

#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
功能:打开文件
参数:pathname:文件路径名
      flags:打开文件的方式
            O_RDONLY:只读
            O_WRONLY:只写
            O_RDWR:可读可写
            O_CREAT:创建
            O_TRUNC:清空
            O_APPEND:追加
返回值:成功:文件描述符
        失败:-1

示例:

当打开方式为:O_CREAT的时候,才会需要使用第三个参数

补充:

1.  当第二个参数中有O_CREAT选项时,需要给open函数传递第三个参数,指定创建文件的权限 ,open(file, xx|O_CREAT|xx, 0666);

2.  实际创建出来的文件权限为指定权限值&(~umask) //umask为文件权限掩码,通过umask命令可以查看

3.  打开文件方式对应表:

标准IO

文件IO

r

O_RDONLY

r+

O_RDWR

w

O_WRONLY|O_TRUNC|O_CREAT

w+

O_RDWR|O_TRUNC|O_CREAT

a

O_APPEND|O_CREAT|O_WRONLY

a+

O_RDWR|O_APPEND|O_CREAT

3.2.  关闭文件

#include <unistd.h>
int close(int fd);

3.3.  读写文件

read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:从一个已打开的可读文件中读取数据
参数:fd  文件描述符
     buf  存放位置
    count  期望的个数
返回值:成功:实际读到的个数
      返回-1:表示出错,并设置errno号
      返回0:表示读到文件结尾

示例:

write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:向指定文件描述符中,写入 count个字节的数据。
参数:fd   文件描述符
          buf   要写的内容
          count  期望值
返回值:成功:实际写入数据的个数
              失败  : -1


示例:

3.4.  文件定位操作

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
功能:设定文件的偏移位置
参数:fd:文件描述符
    offset偏移量  
        正数:向文件结尾位置移动
        负数:向文件开始位置
    whence  相对位置
        SEEK_SET   开始位置
        SEEK_CUR   当前位置
        SEEK_END   结尾位置
返回值:成功:文件的当前位置

示例:

文件属性获取

man 3 stat

#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
功能:获取文件属性
参数:path:文件路径名
       buf:保存文件属性信息的结构体
返回值:成功:0
      失败:-1
struct stat {
        dev_t    st_dev;       /* 设备ID */
        ino_t     st_ino;     /* inode号 */
        mode_t    st_mode;    /* 文件类型和权限 */
        nlink_t   st_nlink;   /* 硬链接数 */
        uid_t     st_uid;     /* 用户ID */
        gid_t     st_gid;     /* 组ID */
        off_t     st_size;    /* 大小 */
        time_t    st_atime;   /* 最后访问时间 */
        time_t    st_mtime;   /* 最后修改时间 */
        time_t    st_ctime;  /* 最后状态改变时间 */
    };

示例:

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

int main(int argc, char const *argv[])
{
    struct stat st;
    stat("test.c", &st);

    printf("%ld\n", st.st_ino);
    printf("%ld\n", st.st_size);
    printf("%ld\n", st.st_nlink);
    
    // 文件类型判断
    // __S_IFMT:文件类型掩码  S_IFREG:普通文件 S_IFDIR:目录
    if((st.st_mode & __S_IFMT) == S_IFREG)
        putchar('-');
    else if((st.st_mode & __S_IFMT) == S_IFDIR)
        putchar('d');

    // 判断文件权限
    // 用户读权限
    if((st.st_mode & S_IRUSR) > 0)
        putchar('r');
    else
        putchar('-');
    
    // 用户写权限
    if((st.st_mode & S_IWUSR) > 0)
        putchar('w');
    else
        putchar('-');

    // 最后一次修改的时间
        // 这个得到的是秒的形式
        // 我们可以借助localtime函数
    printf("%ld\n", st.st_mtime); 

    // 用户名获取
    getpwuid();
    // 获取组名
    getgrgid();
    return 0;
}

目录操作

man 3

围绕目录流进行操作,DIR *

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
功能:获得目录流
参数:要打开的目录
返回值:成功:目录流
       失败:NULL

#include <dirent.h>
struct dirent *readdir(DIR *dirp);
功能:读目录
参数:要读的目录流
返回值:成功:读到的信息    
      失败或读到目录结尾:NULL
返回值为结构体,该结构体成员为描述该目录下的文件信息

struct dirent {
        ino_t   d_ino;                   /* 索引节点号*/
        off_t   d_off;               /*在目录文件中的偏移*/
        unsigned short d_reclen;    /* 文件名长度*/
        unsigned char  d_type;      /* 文件类型 */
        char    d_name[256];      /* 文件名 */
};

#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
功能:关闭目录
参数:dirp:目录流

示例:

标签:文件,CREAT,int,st,----,IO,进程,include,目录
From: https://blog.csdn.net/D1557329860/article/details/141022176

相关文章

  • 【15.PIE-Engine案例——加载Landsat 8 SR数据集】
    加载Landsat8SR数据集原始路径欢迎大家登录航天宏图官网查看本案例原始来源最终结果具体代码/***@File:Landsat8SRImages*@Time:2020/7/21*@Author:piesat*@Version:1.0*@Contact:400-890-0662*@License:(C)Copyr......
  • 美丽世界(洛阳老君山、隋唐洛阳应天门、隋唐洛阳城遗址)
               ......
  • 哈佛大学单细胞课程|笔记汇总 (四)
    (四)Single-cellRNA-seq:Qualitycontrol在QC步骤中,我们的目标和挑战主要包括:目标:筛选数据以仅包括高质量的真实细胞,以便在对细胞进行聚类时,更容易识别不同的细胞类型。识别任何失败的样本并尝试挽救数据或从分析中删除,此外还试图了解样本失败的原因。挑战:从不太复杂......
  • MySQL变量的使用
    目录1.系统变量1.1查看系统变量1.2设置系统变量2.用户自定义变量2.1用户自定义变量赋值2.2查看用户自定义变量3.局部变量3.1局部变量声明3.2局部变量赋值3.3查看局部变量MySQL中的变量分为三大类,系统变量、用户自定义变量、局部变量。1.系统变量系统变量以@@开......
  • 基于JSP和MySQL的小说阅读网站系统
    你好,我是计算机专业的学姐,很高兴和大家分享我的毕业设计——小说阅读网站系统。如果对此有兴趣或任何问题,欢迎随时联系我。开发语言:Java数据库:MySQL技术:JSP+JavaBeans+Servlet工具:常用开发环境(如Eclipse)系统展示首页管理员界面读者个人中心作者个人中心......
  • 基于JSP技术的人事管理系统
    你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。开发语言:Java数据库:MySQL技术:JSP技术+Java语言工具:Myeclipse系统展示首页管理员功能模块员工功能模块部门经理功能模块摘要在高速发展的时代背景下,人们对人事管理系统的需求日益增长,追求......
  • 基于JSP的智能仓储系统
    你好,我是专注于智能系统开发的码农小野。如果对智能仓储系统感兴趣,欢迎私信交流。开发语言Java数据库MySQL技术JSP技术工具MyEclipse、Tomcat系统展示首页[插入论文中的系统首页图片]管理员功能界面员工功能界面供应商功能界面摘要智能仓储系统是利用软......
  • 基于JSP的医院挂号系统
    你好,我是专注于医疗信息系统的计算机专业毕业生。如果您对医院挂号系统感兴趣或有相关需求,欢迎随时联系我。开发语言:Java数据库:MySQL技术:JSP技术工具:MyEclipse系统展示首页管理员功能模块医生功能模块用户前后台功能模块摘要随着网络科技的发展,人们对个性化......
  • 人工神经网络是什么
    深度学习(DeepLearning)这一概念是由 GeoffreyHinton(深度学习之父)于2006年提出,但它的起源时间要早得多,可追溯至20世纪四五十年代,也就是人类刚刚发明出电子计算机时就已经提出来了,但当时并非叫做深度学习,而是人工神经网络(artificialneuralnetwork,ANN),简称神经网络(NN),它是......
  • 4K Video Downloader Plus 中文 授权版
    4KVideoDownloader是一款专门为帮助您从不同的视频网站下载高清视频的软件工具(极速下载站提供),该应用程序为用户提供了将视频保存到FLV,MP4,MKV或3GP的可能性。它拥有直观,整洁的布局,允许用户随时随地执行多项操作。您可以将URL直接粘贴到主面板中,并根据其流类型选择视频质量。此......