标准IO和目录操作

news2024/9/21 0:39:49

1. 标准文件IO

1.1 知识点

2. fopen和fwrite、fread

2.1 使用fwrite和fread实现文件的拷贝

fcopy.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//使用fwrite和fread实现文件的拷贝

int main()
{
	FILE *fp1 = fopen("./2.txt","r");
    if(fp1 == NULL)
	{
		perror("open 1.txt failed");
		return -1;
	}
    FILE *fp2 = fopen("./3.txt","w");
    if(fp2 == NULL)
	{
		perror("open 1.txt failed");
		return -1;
	}
	
	
	char *buf = calloc(5,20);
	
	while(1)
	{

		int start = ftell(fp1);//获取偏移量
		memset(buf,0,5*20);//清空
		size_t n = fread(buf,20,5,fp1);//1.数据块读满了,n == 4,文件没读完, n==3//装不满一块数据块,数据块个数为0		
        if(n == -1)//结束
		{
			perror("fread failed");
			return -1;
		}

        if(n == 5)//满了,文件不一定读完了
		{
            fwrite(buf,20,5,fp2);
		}
		
		if(n < 5)//结束
		{
            int end = ftell(fp1);

			fwrite(buf,end-start,1,fp2);
            fclose(fp1);
            fclose(fp2);
            break;
		}	
		
	}

    // while(fread(buf,1,1,fp1))
	// {

    //     fwrite(buf,1,1,fp2);
	// 	memset(buf,0,5*20);//清空
		
	// }
    // fclose(fp1);
    // fclose(fp2);

    return 0;
	
}

2. 目录和文件操作

2.1 知识点

现在来看看,对于一个目录而言,我们是怎么处理的。其实操作目录跟标准 IO 函数操 作文件类似,也是先获得“ 目录指针”,然后读取一个个的“目录项”。用到的接口函数是:

2.2  打开目录,查看普通文件

dir.c

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

/*
struct dirent
{
ino_t d_ino; // 文件索引号
off_t d_off; //  目录项偏移量
unsigned short d_reclen; // 该目录项大小
unsigned char d_type; // 文件类型
char d_name[256]; // 文件名
};

*/

int main(int argc, char **argv)
{
	DIR *dir = opendir(argv[1]);
	
	struct dirent *ep; 
	
	while(1)
	{
		ep = readdir(dir);//每一个目录项都会获得一个指向目录项结构体的指针ep,直到ep为空
		if(ep == NULL)
		{
			break;
		}
		if(ep->d_type == DT_REG)
		{
			printf("%s\n",ep->d_name);
		}
		
	}
	
	closedir(dir);
	
}

2.3 递归删除目录

my_rm.c

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


void myrm(char *path)//路径
{
	DIR *dir = opendir(path);//获取目录指针
	
	char pathname[128] = {0};//存放路径
	
	struct dirent *ep;
	
	while(1)
	{
		//读取目录
		ep = readdir(dir);//每一个目录项都会获得一个指向目录项结构体的指针ep,直到ep为空
		if(ep == NULL)
		{
			break;
		}
		
		//绕开两个隐藏的目录项.和.. ,用字符串比较函数strcmp(),和ep->name比较,如果相同,continue
		if(strcmp(ep->d_name,".") == 0 || strcmp(ep->d_name,"..") == 0)
		{
			continue;
		}
		
		//普通文件
		if(ep->d_type == DT_REG)
		{
			//argv[1]目录名称+文件名ep->d_name
			//把ep->d_name和argv[1]贴到一个pathname
			//举例
			// /mnt/hgfs/qianrushi230901/read.c   
			snprintf(pathname,sizeof(pathname),"%s/%s",path,ep->d_name);
			printf("贴好的文件路径:%s\n",pathname);													
			unlink(pathname);//删除文件
		}
		
		//目录
		if(ep->d_type == DT_DIR)
		{
			//argv[1]目录名称+文件名ep->d_name
			//把ep->d_name和argv[1]贴到一个pathname
			//举例
			// /mnt/hgfs/qianrushi230901/read 
			snprintf(pathname,sizeof(pathname),"%s/%s",path,ep->d_name);
			printf("贴好的目录路径:%s\n",pathname);

			myrm(pathname);//进入递归
		}
		rmdir(pathname);//删除目录
		
	}
	
	//关闭
	closedir(dir);
}


int main(int argc, char **argv)
{
	
	myrm(argv[1]);
	
}

3. 读取一行数据fgets

值得注意的有以下几点:

1 ,fgets( )跟 fgetc( )一样,当其返回 NULL 时并不能确定究竟是达到文件末尾还是碰 到错误,需要用 feof( )/ferror( )来进一步判断。

2,fgets( )每次读取至多不超过 size 个字节的一行,所谓“一行”即数据至多包含一个 换行符’\n’。

3,gets( )是一个已经过时的接口,因为他没有指定自定义缓冲区s 的大小,这样很容 易造成缓冲区溢出,导致程序段访问错误。

4,fgets( )和 fputs( ),gets( )和 puts( )一般成对使用,鉴于 gets( )的不安全性,一般 建议使用前者。

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

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

相关文章

MyBatis教程之逆向工程(十一)

正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。Hibernate是支持正向工程 的。逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源&#xff1a; 1.Java实体类 2.Mapper…

SSM SpringBoot vue考勤信息管理系统

SSM SpringBoot vue考勤信息管理系统 系统功能 登录 注册 个人中心 部门信息管理 上班时间管理 考勤信息管理 员工信息管理 签到管理 请假信息管理 加班申请管理 出差申请管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或Spring…

MedicalTransformer论文解读

论文是一个分割任务&#xff0c;但这里的方法不局限于分割&#xff0c;运用到检测、分类都可以。 论文下载 https://www.yuque.com/yuqueyonghupjh9oc/ovceh4/onilw42ux6e9n1ne?singleDoc# 《轴注意力机制》 一个问题 为什么transformer一开始都有CNN&#xff1a;降低H、W…

【李肯C语言小册.必读】为什么有这份专栏?解决什么问题?有哪些价值?是否值得订阅?

文末有惊喜...... 一、李肯的自我介绍 【昵称】架构师李肯 【坐标】深圳 【职业】主业中厂物联网架构师&#xff0c;副业技术自媒体 【个人标签】 专注于嵌入式物联网超10年的系统架构师 国产操作系统RT-Thread技术社区专家、2022年度优秀布道师 CSDN深圳城市开发者社区主…

基于Java+Servlet+Mysql的人才招聘网站的设计与实现(附源码 调试 文档)

基于Servlet人才招聘网站的设计与实现 一、引言二、国内外研究现状三、系统需求分析四、系统设计五、系统实现六、系统测试与评估七、结论与展望八、界面展示九、源码获取 摘要 本文介绍了一种基于Servlet人才招聘网站的设计与实现。该系统分为管理员、注册用户和企业用户三种角…

企业怎么在社交媒体进行软文推广?媒介盒子为你支招

数字化时代下&#xff0c;社交媒体已经成为企业进行营销推广的重要渠道&#xff0c;在社交媒体进行软文推广&#xff0c;能够提高企业的知名度与曝光度&#xff0c;还能更好地吸引用户关注&#xff0c;从而实现推广目标。但是想要在社交媒体上进行宣传&#xff0c;软文内容是十…

CS 2520nonono

CS 2520nonono WeChat&#xff1a;yj4399_​​​​​ Sina Visitor System High-level●3 Congestion Control Algorithms:○TCP Reno:■additive increase, multiplicative decrease function to adjust window size for every RTTuntil a packet loss is detected○TCP CUBI…

rabbitmq消息队列实验

实验目的&#xff1a;实现异步通信 实验条件&#xff1a; 主机名 IP地址 组件 test1 20.0.0.10 rabbitmq服务 test2 20.0.0.20 rabbitmq服务 test3 20.0.0.30 rabbitmq服务 实验步骤&#xff1a; 1、安装rabbitmq服务 2、erlang进入命令行&#xff0c;查看版本 …

ArkTS-日期滑动选择器弹窗

日期滑动选择器弹窗 根据指定的日期范围创建日期滑动选择器&#xff0c;展示在弹窗上。 示例 lunar&#xff1a; 接受一个boolean值&#xff0c;日期是否显示为农历。 Entry Component struct DatePickerDialogExample {selectedDate: Date new Date("2010-1-1")Sta…

算法通关村第六关—序列恢复二叉树(青铜)

根据序列恢复二叉树 示例 给定序列恢复二叉树(1)前序&#xff1a;1 2 3 4 5 6 8 7 9 10 11 12 13 15 14(2)中序&#xff1a;3 4 8 6 7 5 2 1 10 9 11 15 13 14 123)后序&#xff1a;8 7 6 5 4 3 2 10 15 14 13 12 11 9 1 一、前中序列恢复二叉树 (1)前序&#xff1a;1 2 3…

python 交互模式和命令行模式的问题

python 模式的冲突 unexpected character after line continuation character 理论上 ide里&#xff0c;输入 python 文件路径\文件.py 就可以执行 但是有时候却报错 unexpected character after line continuation character 出现上述错误的原因是没有退出解释器&#x…

Echarts 大屏注册自定义地图解析文件流报错以及坐标显示数值和地图填充以及dataV轮播数据不显示问题解决

效果图: 1、第一种方式 后台接口获取到SVG图片的文件流,postman能够正确解析出文件流,前端调用api时需要设置返回的响应格式为image/svg+xml格式,否则解析失败 拿到文件流后是这样的 <?xml version="1.0" encoding="utf-8"?> <!-- Generato…

记录 | onnx-simplifier安装、使用

安装&#xff1a; pip install onnx-simplifier# 若想加速 # [可选] 使用豆瓣源加速 pip install -i https://pypi.douban.com/simple onnx-simplifier# [可选] 使用阿里源加速 pip install -i http://mirrors.aliyun.com/pypi/simple onnx-simplifier使用&#xff1a; pytho…

俄罗斯方块小游戏开发

代码图&#xff1a; import pygame, randompygame.init()# 游戏界面参数 width 300 height 600 surface pygame.display.set_mode((width, height))# 颜色定义 black (0, 0, 0) white (255, 255, 255) red (200, 0, 0) green (0, 200, 0) blue (0, 0, 200)# 俄罗斯方块…

iview弹窗提交问题优化

如上图所示 有时候在弹窗中 有比较复杂的表格组件数据 这时候 你如果把提交按钮直接放在弹窗上 就会很麻烦 不仅要处理表格的验证 同时也要维护弹窗的开启和关闭状态 不是很自由 这时候 就看见把提交按钮单独摘出来 可以在自建的按钮上 判断各种状态 是不是很方便呢

Navicat连接Oracle数据库记录

oracle服务如图&#xff1a; navicat连接设置&#xff1a; 测试连接成功&#xff01; 连接创建成功&#xff01;

dubbo发送接收

consumer 主要使用ThreadlessExecutor实现全consumer的全双工通讯。consumer创建本次请求的requestId用于将response和request匹配。 然后分以下几步完成一次请求发送并接收结果&#xff1a; 槽&#xff1a;发送消息前将用于接收结果的executor放到一个map中存储 发送消息&…

三季度利空出尽,金山软件即将“破茧”?

引言&#xff1a;近日&#xff0c;金山软件&#xff08;以下简称为“金山”&#xff09;披露了2023Q3 季报&#xff0c;AI业绩首次兑现如约而至&#xff0c;而伴随着全球AI商业化进程加速&#xff0c;作为国产办公软件领军企业的金山软件是否也迎来了新的盈利风口期&#xff1f…

论文学习-Bert 和GPT 有什么区别?

Foundation Models, Transformers, BERT and GPT 总结一下&#xff1a; Bert 是学习向量表征&#xff0c;让句子中某个词的Embedding关联到句子中其他重要词。最终学习下来&#xff0c;就是词向量的表征。这也是为什么Bert很容易用到下游任务&#xff0c;在做下游任务的时候&a…

Windows核心编程 HOOK

目录 HOOK概述 HOOK API SetWindowsHookExA 函数(winuser.h) UnhookWindowsHookEx 函数(winuser.h) NextHookEx 函数(winuser.h) 局部钩子 全局钩子 为什么全局钩子需要用dll作为过程函数&#xff1f; HOOK概述 本质&#xff1a;Windows消系统的消息过滤器。 全局钩子…