IO进程线程 day4 文件IO与目录操作

 1.使用标准IO完成两个文件拷贝

#include <head.h>
int main(int argc, const char *argv[])
{
	//判断输入是否合法
	if(argc>3)
	{
		printf("输入不合法\n");
		return -1;
	}
	//定义两个文件指针,用于读写
	FILE *fp1=NULL;
	FILE *fp2=NULL;
	if((fp1=fopen(argv[1],"r"))==NULL)
	{
		perror("");
		return -1;
	}
	if((fp2=fopen(argv[2],"w"))==NULL)
	{
		perror("");
		return -1;
	}
	//循环读取搬运
	while(1)
	{
		char buf[20];//定义搬运工
		int res=fread(buf,1,sizeof(buf),fp1);//循环读取字符
		fwrite(buf,1,res,fp2);//将字符拷贝到第二个文件中
		if(feof(fp1))//执行上述操作后,判断光标位置
		{
			break;//如果光标在结尾则退出循环
		}
	}
	//关闭两个文件
	fclose(fp1);
	fclose(fp2);
	return 0;
}
ubuntu@ubuntu:day3$ ls
04write.c  homework1.c  stat.c  test1.c
ubuntu@ubuntu:day3$ gcc homework1.c 
ubuntu@ubuntu:day3$ ./a.out test1.c test2.c
ubuntu@ubuntu:day3$ ls
04write.c  a.out  homework1.c  stat.c  test1.c  test2.c
ubuntu@ubuntu:day3$ 

2.使用文件IO完成两个文件的拷贝

#include <head.h>

int main(int argc, const char *argv[])
{
    //判断传入的文件个数
    if(argc != 3)
    {
        printf("input file error\n");
        printf("usage:./a.out srcfile dstfile\n");
        return -1;
    }

    //定义文件描述符变量
    int srcfd, dstfd;

    //以只读的形式打开源文件
    if((srcfd = open(argv[1], O_RDONLY)) ==-1)
    {
        perror("open srcfile error");
        return -1;
    }
    //以只写的形式打开目标文件
    if((dstfd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0664)) ==-1)
    {
        perror("open dstfile error");
        return -1;
    }
    
    //不断将源文件中的内容读出,写入的目标文件中
    //直到源文件全部读取结束
    char buf[128] = "";
    while(1)
    {

        memset(buf, 0, sizeof(buf));    //将容器清空

        int res = read(srcfd, buf, sizeof(buf));   //从源文件中读取数据

        write(dstfd, buf, res);     //将数据写入目标文件

        //对读取的数据个数进行判断
        if(res == 0)
        {
            break;
        }
    }
    

    //关闭两个文件
    close(srcfd);
    close(dstfd);

    printf("拷贝成功\n");

    return 0;
}
ubuntu@ubuntu:day3$ gcc homework2.c
ubuntu@ubuntu:day3$ ./a.out test2.c test3.c
拷贝成功
ubuntu@ubuntu:day3$ diff test2.c test3.c
ubuntu@ubuntu:day3$ 

3.实现stat函数

#include <head.h>

int main(int argc, const char *argv[])
{
    //定义文件属性类型的数据
    struct stat sx;      //用于存储获得的文件属性

    //调用函数的到文件属性
    stat(argv[1], &sx);

    switch(sx.st_mode&S_IFMT)
    {
    case S_IFSOCK:
        {
            printf("套接字文件\t");
        }
        break;
    case S_IFLNK:
        {
            printf("链接文件\t");
        }
        break;
    case S_IFREG:
        {
            printf("普通文件\t");
        }
        break;
    case S_IFBLK:
        {
            printf("块设备文件\t");
        }
        break;
    case S_IFDIR:
        {
            printf("目录文件\t");
        }
        break;
    case S_IFCHR:
        {
            printf("字符设备文件\t");
        }
        break;
    case S_IFIFO:
        {
            printf("管道文件\t");
        }
        break;

    }

    printf("%#o\t%ld\t%ld\n", sx.st_mode&0777, sx.st_size, sx.st_ino);

    return 0;
}
ubuntu@ubuntu:day3$ gcc homework3.c
ubuntu@ubuntu:day3$ ./a.out test2.c
普通文件	0664	6	667814
ubuntu@ubuntu:day3$ 

4.实现目录操作

#include <head.h>

int main(int argc, const char *argv[])
{
    //判断外部传参个数
    if(argc != 2)
    {
        printf("input error\n");
        printf("usage:./a.out name\n");
        return -1;
    }
    //定义目录指针
    DIR *dp = NULL;
    //打开目录
    if((dp = opendir(argv[1])) == NULL)
    {
        perror("opendir error");
        return -1;
    }

    //读取目录中的文件或目录信息
    struct dirent *sdp = NULL;
    while((sdp = readdir(dp)) != NULL)
    {
        //输出当前文件或目录的信息
        printf("inode:%10ld, size:%10d, %10s, ",\
                sdp->d_ino, sdp->d_reclen, sdp->d_name);

        //输出类型
        switch(sdp->d_type)
        {
        case DT_BLK:
            {
                printf("b\n");
            }
            break;
    case DT_CHR:
            {
                printf("c\n");
            }
            break;

    case DT_DIR:
            {
                printf("d\n");
            }
            break;

    case DT_FIFO:
            {
                printf("p\n");
            }
            break;
    case DT_LNK:
            {
                printf("l\n");
            }
            break;
    case DT_REG:
            {
                printf("-\n");
            }
            break;
    case DT_SOCK:
            {
                printf("s\n");
            }
            break;
        }
    }
    //关闭目录
    closedir(dp);

    return 0;
}
ubuntu@ubuntu:day3$ gcc homework4.c
ubuntu@ubuntu:day3$ ./a.out .
inode:    655425, size:        24,         .., d
inode:    667813, size:        32, homework4.c, -
inode:    667819, size:        32, homework3.c, -
inode:    667822, size:        32,      a.out, -
inode:    667818, size:        32, homework2.c, -
inode:    667816, size:        32, homework1.c, -
inode:    667815, size:        32,    test1.c, -
inode:    667812, size:        32,     stat.c, -
inode:    667808, size:        24,          ., d
inode:    667814, size:        32,    test2.c, -
inode:    667811, size:        32,  04write.c, -
inode:    667817, size:        32,    test3.c, -
ubuntu@ubuntu:day3$ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASP.Net实现海鲜添加(三层架构,异常处理)

演示功能&#xff1a; 点击启动生成页面 点击添加跳转新界面 此处设置文本框多行 点击Button添加 步骤&#xff1a; 1、建文件 下图是三层架构列表&#xff0c;Models里面有模拟数据库中列的类&#xff0c;DAL中有DBHelper和service,BLL中有BllManager文件用于ui界面直接调用…

FreeRTOS——信号量知识点总结及二值信号量实战

1信号量概念 1&#xff09;信号量的计数值都有限制&#xff1a;限定最大值。 如果最大值被限定为1&#xff0c;那么它就是二值信号量&#xff1b; 如果最大值不是1&#xff0c;它就是计数型信号量。 2&#xff09;当计数值大于0&#xff0c;代表有信号量资源 当释放信号量&…

模型融合之模型堆叠

一、理论 模型堆叠&#xff08;Model Stacking&#xff09;是一种集成学习的方法&#xff0c;其本质是将多个基学习器&#xff08;Individual Learner&#xff09;的预测结果作为新的特征&#xff0c;再训练一个元学习器&#xff08;Meta Learner&#xff09;来进行最终的预测。…

探索 Vue 实例方法的魅力:提升 Vue 开发技能(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Green Sock | GSAP 动画库

1.什么是“GSAP”&#xff1f; GreenSock Animation Platform&#xff08;GSAP&#xff09; 是一个业界知名的动画工具套件&#xff0c;在超过1100万个网站上使用&#xff0c;其中包括大量获奖网站&#xff01; 您可以使用GSAP在任何框架中制作几乎任何JavaScript可以触及的动…

迅腾文化传播:触动每个移动消费者心灵的品牌故事缔造者

迅腾文化传播&#xff1a;触动每个移动消费者心灵的品牌故事缔造者 在这个高速发展的移动互联网时代&#xff0c;信息如同浩渺星海中的流星&#xff0c;瞬息万变。每个人的手机、平板、智能手表等移动设备&#xff0c;都成为了他们与世界连接的窗口。品牌&#xff0c;作为这个…

谷歌推出创新SynCLR技术:借助AI生成的数据实现高效图像建模,开启自我训练新纪元!

谷歌推出了一种创新性的合成图像框架&#xff0c;这一框架独特之处在于它完全不依赖真实数据。这个框架首先从合成的图像标题开始&#xff0c;然后基于这些标题生成相应的图像。接下来&#xff0c;通过对比学习的技术进行深度学习&#xff0c;从而训练出能够精准识别和理解这些…

STM32 学习(三)OLED 调试工具

目录 一、简介 二、使用方法 2.1 接线图 2.2 配置引脚 2.3 编写代码 三、Keil 工具调试 一、简介 在进行单片机开发时&#xff0c;有很多调试方法&#xff0c;如下图&#xff1a; 其中 OLED 就是一种比较好用的调试工具&#xff1a; OLED 硬件电路如下&#xff0c…

使用Redis进行搜索

文章目录 构建反向索引 构建反向索引 在Begin-End区域编写 tokenize(content) 函数&#xff0c;实现文本标记化的功能&#xff0c;具体参数与要求如下&#xff1a; 方法参数 content 为待标记化的文本&#xff1b; 文本标记的实现&#xff1a;使用正则表达式提取全小写化后的…

【竞技宝】DOTA2:Mad Kings官宣新阵容 南美新星Jimpark加盟!

北京时间2024年1月3日,随着本月DOTA2ESL吉隆坡站的比赛结束,下一个值得关注的大赛梦幻联赛S22举办的时间要等到今年的二月份了。虽然休赛期的转会狂潮已经过去,但目前还是有很多队伍依然在调整新赛季的阵容。 近日,南美战队Mad Kings在社交平台上官宣了发文,原阵容的所有选手(一…

LeetCode 每日一题 Day 28293031 ||三则模拟||找循环节(hard)

1185. 一周中的第几天 给你一个日期&#xff0c;请你设计一个算法来判断它是对应一周中的哪一天。 输入为三个整数&#xff1a;day、month 和 year&#xff0c;分别表示日、月、年。 您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday…

创建Qt项目

项目工程名称一般不要有特殊符号&#xff0c;不要有中文 项目工程保存路径可修改的&#xff0c;但路径不要带中文 构建系统&#xff0c;有3种&#xff0c;这里使用qmake qmake和cmake区别 构建过程不同&#xff0c;项目管理不同。 1、构建过程&#xff0c;qmake是Qt框架自带的…

完善 Golang Gin 框架的静态中间件:Gin-Static

Gin 是 Golang 生态中目前最受用户欢迎和关注的 Web 框架&#xff0c;但是生态中的 Static 中间件使用起来却一直很不顺手。 所以&#xff0c;我顺手改了它&#xff0c;然后把这个改良版开源了。 写在前面 Gin-static 的改良版&#xff0c;我开源在了 soulteary/gin-static&a…

Twincat中PLC编程的ST语言

在Twincat中&#xff0c;PLC编程使用的是Structured Text&#xff08;ST&#xff09;语言。ST语言是一种类似于Pascal的高级编程语言&#xff0c;专为工业自动化领域的程序开发而设计。它提供了结构化的控制流和数据操作&#xff0c;使得PLC编程更加高效和可靠。 https://kunal…

数字信号处理期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

一文讲清数据资产入表实操

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…

JRT控制打印机

本次测试打印机控制和纸张方向控制。 打印机状态 选择打印机 控制纸张 定义纸张 旋转纸张 不旋转纸张 A4

提高工作效率的Postman环境变量使用方法

在 Postman 中&#xff0c;用 Environments 来管理环境变量。我们在开发的过程中&#xff0c;往往会用到多个环境&#xff1a;开发环境&#xff0c;测试环境&#xff0c;UAT 环境&#xff0c;生产环境等。我们要调用不同环境的 API 时&#xff0c;只需切换 Postman 的 Environm…

Vuex(vue2中的状态机)

目录 Vuex state属性 getters属性 mutations属性 actions属性 modules属性 辅助函数 Vuex 状态管理模式 维护公共状态 公共数据 使用状态机模块维护状态 A组件中分发工作&#xff08;发起异步请求)--->获取数据--->提交突变(将数据提交给突变 ) 通过突变修改状态…

Win32 基本程序设计原理总结

目录 1. Windows系统 基本原理 2. 需要什么函数库&#xff08;.LIB&#xff09; 2.1 C Runtimes&#xff1a; 2.2 Windows API 3. 需要什么头文件&#xff08;.H&#xff09; 4. Windows 程序运行的本质 5. 窗口类的注册与窗口的诞生 6.消息 6.1 消息分类&#xff1a;…