文件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");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot + Nacos 实现动态化线程池

1.背景 在后台开发中&#xff0c;会经常用到线程池技术&#xff0c;对于线程池核心参数的配置很大程度上依靠经验。然而&#xff0c;由于系统运行过程中存在的不确定性&#xff0c;我们很难一劳永逸地规划一个合理的线程池参数。 在对线程池配置参数进行调整时&#xff0c;一…

【已解决】PPT无法复制内容怎么办?

想要复制PPT文件里的内容&#xff0c;却发现复制不了&#xff0c;怎么办&#xff1f; 这种情况&#xff0c;一般是PPT文件被设置了以“只读方式”打开&#xff0c;“只读方式”下的PPT无法进行编辑更改&#xff0c;也无法进行复制粘贴的操作。 想要解决这个问题&#xff0c;我…

PHP分析二维数据表(长度|数字字段|空值|纯姓名|英文用户名|科学计数|是否等长|是否唯一)

先看图&#xff0c;后有完整代码 <?php $t "Excel数据转Sql查询系统字段半智能分析"; $s "Excel复制过来的二维结构表内容,分析查询条件&#xff01;"; $x "字段|最大长度|长度有|数字字段|空值存在|纯姓名|英文用户名|科学计数|是否等长|是否…

DP读书:《openEuler操作系统》(十)套接字 Socket 数据传输的基本模型

10min速通Socket 套接字简介数据传输基本模型1.TCP/IP模型2.UDP模型 套接字类型套接字&#xff08;Socket&#xff09;编程Socket 的连接1.连接概述(1)基本概念(2)连接状态(3)连接队列 2.建立连接3.关闭连接 socket 编程接口介绍数据的传输1. 阻塞与非阻塞2. I/O复用 数据的传输…

2024.02.20作业

1. 使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <time.h> #includ…

C#,二叉搜索树(Binary Search Tree)的迭代方法与源代码

1 二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;又称二叉查找树或二叉排序树。 一棵二叉搜索树是以二叉树来组织的&#xff0c;可以使用一个链表数据结构来表示&#xff0c;其中每一个结点就是一个对象。 一般地&#xff0c;除了key和位置…

【AIGC】Stable Diffusion的常见错误

Stable Diffusion 在使用过程中可能会遇到各种各样的错误。以下是一些常见的错误以及可能的解决方案&#xff1a; 模型加载错误&#xff1a;可能出现模型文件损坏或缺失的情况。解决方案包括重新下载模型文件&#xff0c;确保文件完整并放置在正确的位置。 依赖项错误&#x…

手持三防平板丨国产化加固平板丨国产三防平板发展的意义是什么?

随着现代科技的快速发展&#xff0c;平板电脑在我们的生活中扮演着越来越重要的角色。然而&#xff0c;传统的平板电脑只能在普通的环境中使用&#xff0c;而无法在恶劣的环境中使用&#xff0c;例如在高海拔、高温、高湿度、沙漠等环境中&#xff0c;传统平板电脑往往会出现故…

适用于Android 的 7 大短信恢复应用程序

对于 Android 用户来说&#xff0c;丢失重要的短信可能是一种令人沮丧的体验。幸运的是&#xff0c;有许多短信恢复应用程序可以帮助恢复丢失或删除的短信。在本文中&#xff0c;将与您分享 7 个最佳短信恢复应用程序&#xff0c;并帮助您找到可用于恢复已删除消息的最佳应用程…

美容小程序:让预约更简单,服务更贴心

在当今繁忙的生活节奏中&#xff0c;美容预约常常令人感到繁琐和疲惫。为了解决这个问题&#xff0c;许多美容院和SPA中心已经开始采用美容小程序来简化预约流程&#xff0c;并提供更加贴心的服务。在这篇文章中&#xff0c;我们将引导您了解如何制作一个美容小程序&#xff0c…

阿里云幻兽帕鲁服务器,游戏服务端版本升级怎么操作?

用阿里云一键部署的幻兽帕鲁服务器&#xff0c;想要更新游戏服务端版本&#xff0c;现在非常简单。之前还需要通过输入一行命令来更新&#xff0c;而现在可以直接通过面板上的选型来操作。 打开阿里云的计算巢&#xff0c;找到你的这台服务实例&#xff0c;点击进入&#xff0…

谈谈:你在工作中用到的设计模式!

谈谈:你在工作中用到的设计模式! Hello大家龙年好! 春节的假期转眼间过去,我们也要回归往日的节奏 因为最近和小伙伴们聊天发现,我们普遍在面试中,对被问起设计模式在工作中的应用,既有点熟悉,又有点陌生, 在网上看吧,又感觉鸡肋(为啥?不能解燃煤之急啊!哈哈),所以,为了打破这…

(十四)devops持续集成开发——jenkins流水线使用pipeline方式发布项目

前言 本节内容我们使用另外一种方式pipeline实现项目的流水线部署发布&#xff0c;Jenkins Pipeline是一种允许以代码方式定义持续集成和持续交付流水线的工具。通过Jenkins Pipeline&#xff0c;可以将整个项目的构建、测试和部署过程以脚本的形式写入Jenkinsfile中&#xff…

centos7 arm服务器编译安装onnxruntime-gpu

前言 ONNX Runtime是适用于Linux,Windows和Mac上ONNX格式的机器学习模型的高性能推理引擎,但在arm服务器上,onnxruntime只有CPU版的,GPU版的没有,因此需要自行去编译GPU版本的才可以。 环境准备 1、python3.8 2、cmake:2.26.0版本以上,可以直接下载aarch64版本的进行…

数据库应用:kylin 部署 达梦数据库DM8

目录 一、实验 1.环境 2.部署前规划 3.部署达梦数据库DM8 4.创建数据库及数据库事例管理 5.达梦数据库的基本操作 二、问题 1.xhost命令报错 2.执行安装程序DMInstall.bin 报错 3.解压安装程序报错 4.安装程序找不到文件 5.图像化界面打不开 6.安装内存太小 7.打开…

程序员为什么不喜欢关电脑?没有的事!

程序员为什么不喜欢关电脑&#xff1f; 我干程序员 10 年了&#xff0c;这些年确实不怎么关电脑。不过我感觉这个习惯跟程序员这个职业是无关的&#xff0c;假如我今天不干程序员&#xff0c;我估计也照样不关电脑。其实&#xff0c;我们不妨反过来问&#xff0c;你喜欢关电脑…

BUGKU-WEB bp

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

五种多目标优化算法(MOJS、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOJS 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

OJ_电子地图

题干 小明是今年参加复试的外校考生&#xff0c;他要去民主楼小礼堂签到。由于对中南大学校本部很不熟悉&#xff0c;小明找到了这边读书的好朋友鲁大师&#xff0c;不巧&#xff0c;鲁大师在忙着自由探索项目的结题工作&#xff0c;不能给他带路&#xff0c;只好给他发了一份…

HarmonyOS 鸿蒙应用开发(十一、面向鸿蒙开发的JavaScript基础)

ArkTS 是HarmonyOS&#xff08;鸿蒙操作系统&#xff09;原生应用开发的首选语言。它是用于构建用户界面的一种TypeScript方言&#xff0c;扩展了TypeScript以适应HarmonyOS生态系统的UI开发需求。ArkTS 融合了TypeScript的静态类型系统和现代UI框架的设计理念&#xff0c;为开…