文件IO,目录IO的学习

这篇具有很好参考价值的文章主要介绍了文件IO,目录IO的学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,头文件的添加

#ifndef _HEAD_H_                     //防止重新定义宏
#define _HEAD_H_


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

#endif

用法:#include“head.h”    ->     在当前目录下寻找头文件

二,主函数的传参

写法:

文件IO,目录IO的学习,开发语言,c语言,算法,linux,数据结构,线性回归,逻辑回归

输出结果:

文件IO,目录IO的学习,开发语言,c语言,算法,linux,数据结构,线性回归,逻辑回归

理解图:

文件IO,目录IO的学习,开发语言,c语言,算法,linux,数据结构,线性回归,逻辑回归

主函数的传参中,argc是传参的个数  ,const char *argv[]是一个指针数组,存放的指针类型数据
argv【n】,n=1/2/3 分别代表三个指针参数

标准示例:

int main(int argc,const char *argv[])           //argc是传参的个数  *argv[]是一个指针数组,存放的指针类型数据
{
	int fsrc = 0;                               //定义文件描述符的变量
	int fdst = 0;
	char tmpbuff[4096] = {0};
	ssize_t nret = 0;                           //定义接收read的返回值的变量

	if(argc!=3)                                 //若是主函数传参数量不为3,报错
	{
		fprintf(stderr,"Usage:./a.out srcfilename dstfilename\n");
		return -1;
	}

	fsrc = open(argv[1],O_RDONLY);
	if(fsrc == -1)
	{
		perror("fail to open");
		return -1;
	}

	fdst = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664);
	if (-1 == fdst)
	{
		perror("fail to open");
		return -1;
	}

	while (1)
	{
		nret = read(fsrc, tmpbuff, sizeof(tmpbuff));  //接收的返回值,若为0,代表读完 
                                                        了。跳出循环
		if (nret <= 0)
		{
			break;
		}

		write(fdst, tmpbuff, nret);                //写入数据,从tmpbuff中写入进f 
                                                   dst中,字节为接收的读的返回值的数量
	}

	close(fsrc);
	close(fdst);

	return 0;
}

三,文件IO的拓展

1.标准IO是对文件IO的封装(的调用):

2.文件对应的IO操作类型:

文件IO,目录IO的学习,开发语言,c语言,算法,linux,数据结构,线性回归,逻辑回归

3.lseek:

    off_t lseek(int fd, off_t offset, int whence);
       功能:
            重新设定文件描述符的偏移量
       参数:
            fd:文件描述符
            offset:偏移量
            whence:
                SEEK_SET    文件开头
                SEEK_CUR    文件当前位置
                SEEK_END    文件末尾
       返回值:
            成功返回当前偏移量(off_t 类型的)
            失败返回-1

标准用法:

int main(void)
{
	int fd = 0;
	off_t len = 0;      //定义一个off_t 类型的变量接收 偏移量的长度
	char ch = 0;        //定义一个字符变量,用来作为写入数据的地址

	fd = open("a.txt",O_WRONLY | O_CREAT | O_TRUNC, 0664);
	if(fd == -1)
	{
		perror("fail to open");
		return -1;
	}

	len = lseek(fd,10,SEEK_SET);   //从开头偏移10个长度
	printf("len = %ld\n",len);
	ch = 'a';
	write(fd,&ch,1);

	len = lseek(fd,-5,SEEK_CUR);
	printf("len = %ld\n",len);
	ch = 'b';
	write(fd,&ch,1);

	len = lseek(fd,0,SEEK_SET);
	printf("len = %ld\n",len);
	ch = 'c';
	write(fd,&ch,1);

	close(fd);

	return 0;

四,目录IO:

1.mkdir 

     int mkdir(const char *pathname, mode_t mode);
      功能:
        创建目录文件
      参数:
        pathname:文件路径
        mode:文件的权限
      返回值:
        成功返回0 
        失败返回-1 

        rwx rwx rwx
        111 111 111(权限有权为1)
        0777(八进制转换,作为权限的用途)

        r: 目录中是否能够查看文件
        w: 目录中是否能够新建文件
        x: 目录是否能够进入

2.rmdir

      int rmdir(const char *pathname);
      功能:
        删除空目录文件
      返回值:
        成功返回0 
        失败返回-1 

3.opendir

     DIR *opendir(const char *name);
      功能:
        打开目录获得目录流指针
      参数:
        name:目录文件路径
      返回值:
        成功返回目录流指针
        失败返回NULL

     4.closedir

      int closedir(DIR *dirp);
      功能:
        关闭目录流指针

5.readdir

      struct dirent *readdir(DIR *dirp);
      功能:
        从目录流中读取下一个目录项的结构体信息
      参数:
        dirp:目录流指针
      返回值:
        成功返回包含目录项信息的空间首地址
        失败返回NULL
        读到文件末尾返回NULL

        结构体的成员:   struct dirent {
            ino_t          d_ino;       /* Inode number */
            off_t          d_off;       /* Not an offset; see below */
            unsigned short d_reclen;    /* Length of this record */
            unsigned char  d_type;      /* Type of file; not supported
                                            by all filesystem types */
            char           d_name[256]; /* Null-terminated filename */
        };

一个目录的创建,打开,读取信息,关闭的标准写法:

int main(void)
{
	DIR *dp = NULL;                 //定义一个这种类型的指针用来接收opendir的地址(为目录流指针)
	struct dirent *pp = NULL;       //定义一个这种类型的指针用来接收readdir的返回值(为结构体的首地址)

	//mkdir("mulu",0777);
	//创建一个 ”mulu“ 的目录,0777为权限

	dp = opendir("mulu");          //打开mulu,用dp接收
	if(dp == NULL)
	{
		perror("fail to opendir");
		return -1;
	}

	while(1)
	{
		pp = readdir(dp);           //读目录流指针的内容(是一个结构体),返回值为结构体的首地址,用pp接收
		if(pp == NULL)
		{
			break;                 //若接收不到跳出
		}

		if(*pp -> d_name == '.')
		{
			continue;               //若为‘.’(隐藏目录),跳出重新循环,不做打印
		}

		printf("%s\n",pp->d_name);  //打印pp(结构体首地址)中 d_name 成员的内容
	}
	closedir(dp);

	return 0;

6.chdir 

      int chdir(const char *path);
参数:     const char *path - 文件的目录名或者“操作指令(如..)
功能:
        切换当前代码的工作路径

7.getcwd

      char *getcwd(char *buf, size_t size);
参数:      char *buf - 存放获得当前目录的绝对路径的地址
                 size_t size - 
功能:
        获得当前目录的绝对路径

切换当前工作路径以及获得当前路径打印:

int main(void)
{
	char tmpbuff[4096] = {0};           //定义一个字符数组存放获取地址的

	getcwd(tmpbuff,sizeof(tmpbuff));    //获取当前目录的绝对路径放在tmpbuff中
	printf("tmpbuff = %s\n",tmpbuff);

	chdir("..");
	getcwd(tmpbuff,sizeof(tmpbuff));
	printf("tmpbuff = %s\n",tmpbuff);

	return 0;
}

主函数的传参实现目录的信息的读取和打印: 

 //  主函数的传参实现目录的信息的读取和打印

int ListDir(const char *pdorname)     //
{
	DIR *dp = NULL;                 //目录流指针
	struct dirent *pp = NULL;       //接收readdir返回值为结构体的首地址
	char tmpbuff[4096] = {0};       //存放字符串

	dp = opendir(pdorname);         //目录流指针接收返回值
	if(dp == NULL)
	{
		perror("fail to opendir");
		return -1;
	}

	while(1)
	{
		pp = readdir(dp);           //接收返回值,文件信息的结构体首地址
		if(pp == NULL)
		{
			break;                 //为空读完跳出(递归的结束,也是目录信息的读取的结束)
		}

		if(pp -> d_name[0] == '.')
		{
			continue;              //判断隐藏文件(是的话不做输出)
		}
 
 		sprintf(tmpbuff,"%s/%s",pdorname,pp -> d_name); //sprintf是将后面计算出来的"%s/%s"中的内容都输入到tmpbuff中(拼接作用)
		                                                //pdorname是接收的目录地址 pp->d_name 是文件信息结构体中的文件名字中的内容
		printf("%s\n",tmpbuff);

		if(pp -> d_type == DT_DIR)  //如果结构体 -> 文件类型 == 目录类型的
		{
			ListDir(tmpbuff);       //递归(此时tmpbuff作为目录地址)
		}
	}

	closedir(dp);

	return 0;

}

int main(int argc,const char *argv[])
{
	if(argc != 2)          //满足参数为2个
	{
		fprintf(stderr,"Usage:./a.out dirname\n");
		return -1;
	}

	ListDir(argv[1]);      //调用函数

	return 0;
}

8.access

      int access(const char *pathname, int mode);
      功能:
        检测调用函数的程序对文件是否拥有指定权限
      参数:
        pathname:文件路径
        mode:
            R_OK    检测是否拥有读权限
            W_OK    检测是否拥有写权限
            X_OK    检测是否拥有执行权限
            F_OK    检测文件是否存在
      返回值:
        有该权限返回0
        出错返回-1  

代码实现:文章来源地址https://www.toymoban.com/news/detail-830861.html

                                    //检测文件是否存在
int main(int argc,const char *argv[])
{
	int ret = 0;

	if(argc!=2)
	{
		fprintf(stderr,"Usage:./a.out dirname\n");
		return -1;
	}

	ret = access(argv[1],F_OK);
	if(ret == 0)
	{
		printf("该文件存在\n");

	}else
	{
		printf("该文件不存在\n");
	}
}

到了这里,关于文件IO,目录IO的学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 学习笔记(2)—— 关于文件和目录

    目录 1、切换目录 2、查看系统信息 3、文本的创建和编辑 3-1)创建文件  3-2)查看文件 3-3)输出重定向和追加重定向等 3-4)使用 vi 编辑器编辑文件 4、文件和文件夹的处理 4-1)对文件的处理  4-2)查看目录信息 4-3)对目录的操作 5、文件查找 6、查找文件中的内容 7、使用

    2024年02月09日
    浏览(68)
  • IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取

          一、文件IO 1、文件io通过系统调用来操作文件 系统调用:系统提供给用户的一组API(接口函数)         open/read/write/close/lseek... 用户空间进程访问内核的接口 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性(同一系统下) 是操作

    2024年02月11日
    浏览(39)
  • IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取

          一、文件IO 1、文件io通过系统调用来操作文件 系统调用:系统提供给用户的一组API(接口函数)         open/read/write/close/lseek... 用户空间进程访问内核的接口 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性(同一系统下) 是操作

    2024年02月11日
    浏览(35)
  • 【学习笔记】数据结构算法文档(类C语言)

    1.1.1 线性表的顺序存储表示 1.1.2 顺序表中基本操作的实现 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 删除 1.1.2.6 计数 1.2.1 单链表的定义和表示 ★ 关于结点 1.2.2 单链表基本操作的实现 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 删除 1.2.2.6 前插法创建单

    2024年02月07日
    浏览(44)
  • 目录IO 2月19日学习笔记

     1. lseek        off_t lseek(int fd, off_t offset, int whence);        功能:             重新设定文件描述符的偏移量        参数:             fd:文件描述符             offset:偏移量             whence:                 SEEK_SET    文件开头                 SEEK_CUR    文件当前

    2024年02月20日
    浏览(35)
  • 【JavaEE】文件操作和IO-目录扫描全文检索小程序

    不知道说啥了,看看吧 在之前的学习中,基本上都是围绕内存展开的~ MySQL 主要是操作硬盘的 文件IO也是是操作硬盘的~ IO : i nput o utput 创造文件,删除文件,重命名文件,创建目录······ 一些操作没有权限也做不了~ 1.1 路径 就是我们的文件系统上的一个文件/ 目录 的具

    2024年02月09日
    浏览(42)
  • JavaEE & 文件操作和IO & 目录扫描全文检索小程序

    不知道说啥了,看看吧 在之前的学习中,基本上都是围绕内存展开的~ MySQL 主要是操作硬盘的 文件IO也是是操作硬盘的~ IO : i nput o utput 创造文件,删除文件,重命名文件,创建目录······ 一些操作没有权限也做不了~ 1.1 路径 就是我们的文件系统上的一个文件/ 目录 的具

    2023年04月09日
    浏览(39)
  • 数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)

    目录 问题描述  解题思路 伪代码  总体算法 DFS算法 伪代码解读 总体算法 DFS算法 具体实现(C语言) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑

    2024年02月05日
    浏览(78)
  • 数据结构 C语言 树形结构 简单目录管理系统

    在图书、操作系统文件夹、学生等管理系统中,目录管理是必要环节,如何高效搜寻与低复杂度存储是实现这一环节的关键性问题。本课程设计需完成一种基于多叉树结构简单目录管理系统,该系统能以交互式界面进行创建目录、删除目录、查找目录、修改目录、层次遍历目

    2024年02月04日
    浏览(47)
  • 数据结构 C语言 树形结构 简单目录管理系统

    在图书、操作系统文件夹、学生等管理系统中,目录管理是必要环节,如何高效搜寻与低复杂度存储是实现这一环节的关键性问题。本课程设计需完成一种基于多叉树结构简单目录管理系统,该系统能以交互式界面进行创建目录、删除目录、查找目录、修改目录、层次遍历目

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包