文件IO,目录IO的学习

news2025/1/17 21:43:52

一,头文件的添加

#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”    ->     在当前目录下寻找头文件

二,主函数的传参

写法:

输出结果:

理解图:

主函数的传参中,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操作类型:


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  

代码实现:

                                    //检测文件是否存在
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");
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1458464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】Leetcode 27.移除元素

一、代码实现 如果不考虑O(1)的空间复杂度的话我们可以再创建数组来进行遍历解决该问题&#xff0c;但是在要求之下该做法无法通过。于是我们可以用双指针来解决&#xff0c;最坏的情况时间复杂度为O(N)。 int removeElement(int* nums, int numsSize, int val) {int src 0;…

http相关概念以及apache的功能

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),流程描述篇

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

【C语言】初步认识结构体

1.结构体诞生的由来 C语言已经提供了内置类型&#xff0c;如&#xff1a;char、short、int、long、float、double等&#xff0c;但是只有这些内置类型还是不够的&#xff0c;假设我想描述学生&#xff0c;描述⼀本书&#xff0c;这时单一的内置类型是不行的。描述⼀个学生需要名…

从数据库中读取文件导出为Excel

使用的库&#xff08;org.apache.poi&#xff09; 在poi包中有Apache提供的各种分类文件&#xff0c;如下 结构功能HSSF读写Microsoft Excel XLS文件XSSF读写Microsoft Excel OOXML XLSX文件HWPF读写Microsoft Word DOC文件HSLF读写Microsoft PowerPoint文件 下面以XSSF为例&…

优思学院|精益思想如何识别价值流?【案例分析】

精益思想是一种为了提高效率、减少浪费的管理哲学&#xff0c;精益思想强调在整个生产过程中识别并消除一切不创造价值的步骤。 价值流分析是精益思想中的一个核心概念&#xff0c;通过深入分析特定产品从原材料到最终交付给顾客的全过程&#xff0c;来识别并削减浪费&#xf…

回避型人格适合什么职业?如何改善回避型人格?

回避型人格最突出的特点,就是对外界的排斥极度敏感&#xff0c;他们非常害怕别人的不认可&#xff0c;也特别害惧失败&#xff0c;因此不敢与人交往&#xff0c;同时也害怕新事物。因为受到这一性格的影响&#xff0c;他们极度缺乏社交能力&#xff0c;也一直在否定自身能力。 …

算法沉淀——递归(leetcode真题剖析)

算法沉淀——递归 01.汉诺塔问题02.合并两个有序链表03.反转链表04.两两交换链表中的节点05.Pow(x, n) 递归是一种通过调用自身的方式来解决问题的算法。在递归算法中&#xff0c;问题被分解为更小的相似子问题&#xff0c;然后通过对这些子问题的解进行组合来解决原始问题。递…

Stable Diffusion WebUI 界面介绍

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文主要对 Stable Diffusion WebUI 的界面进行简单的介绍&#xff0c;让你对该 WebUI 有个大致的了解&#xff0c;为后面的深入学习打下一个基础。主要内容包…

2.19学习总结

1.中位数 2.统计和 3.铺设道路 4.岛屿个数 5.冶炼金属 6.飞机降落 7.接龙数列 中位数https://www.luogu.com.cn/problem/P1168 题目描述 给定一个长度为 &#xfffd;N 的非负整数序列 &#xfffd;A&#xff0c;对于前奇数项求中位数。 输入格式 第一行一个正整数 &#xfff…

C++学习Day07之虚函数和纯虚函数

目录 前言一、程序及输出1.1 虚函数1.2 纯虚函数1.2.1 定义、示例1.2.2 引入原因1.2.3 抽象类 二、分析与总结 前言 在 C 中&#xff0c;虚函数和纯虚函数是实现多态性的重要概念。虚函数是在基类中声明为虚函数的函数&#xff0c;在派生类中可以被重写&#xff0c;实现动态联…

java原生态提取图片内的文本信息操作Demo

java原生态提取图片内的文本信息操作Demo!现在市面上很多客户都有从图片中提取文本信息的业务需求&#xff0c;那么&#xff0c;java的操作案例代码就来了&#xff0c;但是有一个坏消息告诉大家&#xff0c;市面上开源的 插件包&#xff0c;目前我测试的提取效果&#xff0c;是…

前端首屏、白屏与卡顿性能优化?你想要的都在这里!

您好&#xff0c; 如果喜欢我的文章或者想上岸大厂&#xff0c;可以关注公众号「量子前端」&#xff0c;将不定期关注推送前端好文、分享就业资料秘籍&#xff0c;也希望有机会一对一帮助你实现梦想 首屏秒开 首屏秒开主要可以分为 4 个方法——懒加载&#xff0c;缓存&#…

钠离子电池技术

一、什么是钠离子电池 1、发展背景 在现有电池技术中&#xff0c;锂离子电池&#xff08;LIB&#xff09;具有无与伦比的能量密度和多功能性。自其首次商业化以来&#xff0c;便携式设备一直在推动其高速增长。近年&#xff0c;电动汽车和固定式储能应用开始兴起。由于锂离子…

ChatGPT-01 用ChatGPT指令,自学任何领域的系统知识

1. 指令位置 Github仓库&#xff1a;Mr Ranedeer AI Tutor 但是需要开通chatgtp plus版本&#xff0c;并且打开代码解释器 2 使用 学习内容 开始学习 GPT甚至可以给你思考题&#xff0c;给出的答案还能进行评价 配置 通过配置表修改 深度 学习风格 沟通风格 语气风格 …

第一件事 什么是 Java 虚拟机 (JVM)

1、什么是虚拟机&#xff1f; - 这个其实是一个挺逗的事情&#xff0c;说白了&#xff0c;就是基于某个硬件架构&#xff0c;在这个硬件部署了一个操作系统&#xff0c;再构架一层虚拟的操作系统&#xff0c;这个新构架的操作系统就是虚拟机。 不知道的兄弟姐妹们&#xff0c;…

格式化硬盘的方法有哪些?

格式化硬盘意味着彻底删除磁盘数据、设置文件系统并准备硬盘上选定的分区&#xff0c;以供操作系统使用。格式化方法分为两种&#xff0c;高级和低级&#xff0c;其中高级格式化涉及将文件系统写入分区&#xff0c;以便通过软件从分区中读取和写入数据来组织和理解数据&#xf…

通俗易懂地理解稀疏性

今天我想与大家探讨的是一个数学和工程学中的重要概念——稀疏性。这个概念可能听起来很抽象&#xff0c;但它实际上贯穿于我们生活中的许多方面。那么&#xff0c;稀疏性到底是什么呢&#xff1f;简单来说&#xff0c;在数学和信号处理领域&#xff0c;一个信号被称为稀疏&…

网络原理HTTP/HTTPS(2)

文章目录 HTTP响应状态码200 OK3xx 表示重定向4xx5xx状态码小结 HTTPSHTTPS的加密对称加密非对称加密 HTTP响应状态码 状态码表⽰访问⼀个⻚⾯的结果.(是访问成功,还是失败,还是其他的⼀些情况…).以下为常见的状态码. 200 OK 这是⼀个最常⻅的状态码,表⽰访问成功 2xx都表示…

redis 异步队列

//produceMessage.ts 模拟生产者 import Redis from ioredis; const redis new Redis(); // 生产者&#xff1a;将消息推送到队列 async function produceMessage(queueName:string, message:string) {try {await redis.rpush(queueName, message);console.log(Produced messa…