C语言学习笔记 Day16(C10文件管理--下)

Day16 内容梳理:

C语言学习笔记 Day14(文件管理--上)-CSDN博客

C语言学习笔记 Day15(文件管理--中)-CSDN博客

目录

Chapter 10  文件操作

10.5 文件状态

10.6 文件的随机读写 fseek()、rewind()

(1)fseek():移动光标并开始读写

(2)rewind():将光标重置回文件开头

10.7 文件的删除remove()、重命名rename()

(1)删除remove():

(2)重命名、移动位置rename():

10.8 文件缓冲区

(1)基础概念

(2)更新缓冲区


Chapter 10  文件操作

10.5 文件状态

获取文件的大小

#include<sys/types.h>
#include<sys/stat.h>

int main() {
	//文件状态结构体变量
	struct stat st;
	stat("D:/abc.txt", &st);
	
	printf("文件大小:%d\n", st.st_size);
	return 0;
}

10.6 文件的随机读写 fseek()、rewind()

(1)fseek():移动光标并开始读写

之前的文件都是顺序读写,而在可以在随机读写中,改变文件光标的位置。

先创建好一个名为“随机读写.txt”的文本文件,写入如下内容:

fseek()函数的三个参数:文件指针、offset位移数、whence移动的起始位置

offset:往左偏移是负数,往右偏移是正数

whence有三种类型的参数:

SEEK_SET:从文件开头移动offset个字节

SEEK_CUR:从当前位置移动offset个字节

SEEK_END:从文件末尾移动offset个字节

因为文本文件中,每一行的结尾是\r\n(不会显示在文本中),算两个字节,所以算offset的时候需要加上这2个字节。

\r\n存在于除了末尾那行以外的其他行,所以从末尾开始偏移的话不需要考虑\r\n的字节。

代码如下,把三种类型的whence参数都试写了一遍:

int main() {
	FILE* fp = fopen("D:/随机读写.txt", "r");
	if (!fp) return -1;	//处理文件读取失败的情况

	char arr[100];

	//打印第1行的内容
	memset(arr, 0, 100);
	fgets(arr, 100, fp);
	printf("%s", arr);

	//打印第2行的内容
	memset(arr, 0, 100);
	fgets(arr, 100, fp);
	printf("%s", arr);
	//这行打印完之后,就读完了“12345678”和“abcde”,文件的光标此时移动到了第三行开头

	//文件随机读写:从当前位置偏移
	//(效果:再打印一遍第2行)
	fseek(fp,-7, SEEK_CUR);	//格式:文件指针、偏移量、位置。     “abcde”的末尾还有\r\n,各1字节、每个字母1字节,又是往前打印,所以偏移量是-7
	memset(arr, 0, 100);
	fgets(arr, 100, fp);
	printf("%s", arr);

	//文件随机读写:从文件开头偏移
	//(效果:再打印一遍第1行)
	fseek(fp, 0, SEEK_SET);	//格式:文件指针、偏移量、位置。     “12345678”是文件开头,SEEK_SET是从开头开始打印,所以偏移量是0
	memset(arr, 0, 100);
	fgets(arr, 100, fp);
	printf("%s", arr);

	//文件随机读写:从文件末尾偏移
	//(效果:打印一遍最后一行)
	fseek(fp, -10, SEEK_END);	//格式:文件指针、偏移量、位置。     “fghijklmno”的末尾没有\r\n,偏移量是-10,保证能从文件末尾移动到“f”然后往后打印
	memset(arr, 0, 100);
	fgets(arr, 100, fp);
	printf("%s", arr);

	return 0;
}

上图代码的打印结果如下:正常打印了两行,跳到上一行打印了一下,跳到文件开头行打印了一下,又跳到文件末尾行打印了一下

(2)rewind():将光标重置回文件开头

使用方式:rewind(文件指针)

作用效果等同于fseek(文件指针,0,SEEK_SET)

int main() {
	FILE* fp = fopen("D:/随机读写.txt", "r");
	if (!fp) return -1;	//处理文件读取失败的情况

	char arr[100];

	//打印第1行的内容
	memset(arr, 0, 100);
	fgets(arr, 100, fp);
	printf("%s", arr);

	//打印第2行的内容
	memset(arr, 0, 100);
	fgets(arr, 100, fp);
	printf("%s", arr);
	//这行打印完之后,就读完了“12345678”和“abcde”,文件的光标此时移动到了第三行开头

	//用rewind(fp)重置光标
	rewind(fp);
	memset(arr, 0, 100);
	fgets(arr, 100, fp);
	printf("%s", arr);	//会打印第1行的内容,也就是“12345678”

	return 0;
}

10.7 文件的删除remove()、重命名rename()

(1)删除remove():

需要注意的是,以这样的方式删除的文件不会进入到回收站中,难以找回,慎用remove()。

删除这个文件:

代码如下:

int main() {
	int value = remove("D:/abc.txt");
	
	if (value == 0) printf("删除成功");
	else printf("删除失败");
	return 0;
}

运行结果: 

文件中也确实没有abc.txt了:

(2)重命名、移动位置rename():

①重命名:

把“解密1.txt”更名为”解密加密的原始语句.txt”

代码和效果如下:

int main() {
	//重命名rename()
	int value = rename("D:/解密1.txt", "D:/解密加密的原始语句.txt");	//两个参数:旧名字、新名字
	
	if (value == 0) printf("改名成功");
	else printf("改名失败");
	return 0;
}

里面的文本没有发生变动,只有文件名被改了。

②移动位置:

把D盘的“加密1.txt”移动至D盘的“Program Files”文件夹中

int main() {
	//移动文件rename()
	int value = rename("D:/加密1.txt", "D:/Program Files/加密1.txt");	//两个参数:旧位置、新位置

	if (value == 0) printf("移动成功");
	else printf("移动失败");
	return 0;
}

移动效果:

10.8 文件缓冲区

(1)基础概念

通常用“缓冲文件系统”来处理数据文件。

缓冲文件系统是指系统自动在内存区为程序中每个在使用的文件开辟一个文件缓冲区,暂存从内存向磁盘运输的文件,装满整个缓冲区后才一起送到磁盘中。就像是定时定点到站的公交车一样。

缓冲区的作用是协调低速的输入输出设备和高速的CPU,避免低速的输入输出设备占用CPU,从而解放出CPU并使其能够高效率工作。

缓冲区有两种保存方式,一种是按固定时间间隔保存数据(比如每10秒保存一下),另一种是按固定数据量保存数据(比如每100字保存一下)。

(2)更新缓冲区

不太建议实际写代码时按下图中这样写,因为频繁和硬盘交互会损伤硬盘。最好是手动规定一个字节长度,代码到这个长度了再保存。

int main() {
	FILE* fp = fopen("D:/更新缓冲区文件.txt", "w+");
	
	if (!fp) return -1;

	char ch;
	while (1) {
		scanf("%c", &ch);
		if (ch == '@') break;	//设定个终止输入的符号
		
		fflush(fp);	//更新缓冲区
		fputc(ch, fp);
	}
	fclose(fp);
	return 0;
}

一边输入,一边保存到了文本文件中:

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

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

相关文章

【初阶数据结构】详解栈和队列(来自知识星空的一抹流光)

文章目录 前言1. 栈1.1 栈的概念及结构1.2 栈的实现1.2.1 "栈"实现的选择 1.3 栈的代码实现1.3.1 栈的结构体定义&#xff08;用的是顺序表&#xff09;1.3.2 栈的头文件设置1.3.3 栈的各功能的实现 2. 队列2.1 队列的概念及结构2.2 "队列"实现的选择2.3 队…

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息&#xff0c;然后展示在页面上。 效果展示 首次发送需要…

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中&#xff0c; "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时&#xff0c;经常听到第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;以及 BCNF&#xff08;Boyce-…

滑动窗口在算法中的应用

滑动窗口是一种经典的算法技巧&#xff0c;就像在处理一系列动态数据时&#xff0c;用一扇可以滑动的“窗口”来捕捉一段连续的子数组或子字符串。通过不断地移动窗口的起点或终点&#xff0c;我们能够以较低的时间复杂度来解决一系列问题。在这篇文章中&#xff0c;我们将通过…

维信小程序禁止截屏/录屏

一、维信小程序禁止截屏/录屏 //录屏截屏,禁用wx.setVisualEffectOnCapture({visualEffect:hidden});wx.setVisualEffectOnCapture(Object object) 测试安卓手机&#xff1a; 用户截屏&#xff0c;被禁用 用户录屏&#xff0c;录制的是空白内容/黑色内容的视频。 二、微信小…

C++ | Leetcode C++题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> lexicalOrder(int n) {vector<int> ret(n);int number 1;for (int i 0; i < n; i) {ret[i] number;if (number * 10 < n) {number * 10;} else {while (number % 10 9 || numbe…

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求&#xff0c;要求做一款播放器&#xff0c;发现能力上跟EasyPlayer.js基本一致&#xff0c;满足要求&#xff1a; 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏&#xff08;单屏/全屏&#xff09; 多分屏&#xff08;2*2&#xff09; 多分屏…

【阿一网络安全】如何让你的密码更安全?(二) - 非对称加密

上次《【阿一网络安全】如何让你的密码更安全&#xff1f;(一) - 对称加密》提到加密算法的对称加密&#xff0c;我们这次来聊聊非对称加密。 和对称加密不同&#xff0c;非对称加密的加密密钥和解密密钥不同。 非对称加密 大概过程就是&#xff0c;发送方使用公钥对明文数据…

mac 安装redis

官网下载指定版本的redis https://redis.io/ 目前3.2.0 是最新最稳定的 版本 这里是历史版本下载 下载指定版本 安装 1.放到自定义目录下并解压 2.打开终端&#xff0c;执行命令 cd redis的安装目录下 make test -- 此命令的作用是将redis源代码编译成可执行文件&#xff0c…

SPI驱动学习五(如何编写SPI设备驱动程序)

目录 一、SPI驱动程序框架二、怎么编写SPI设备驱动程序1. 编写设备树2. 注册spi_driver3. 怎么发起SPI传输3.1 接口函数3.2 函数解析 三、示例1&#xff1a;编写SPI_DAC模块驱动程序1. 要做什么事情2. 硬件2.1 原理图2.2 连接 3. 编写设备树4. 编写驱动程序5. 编写app层操作程序…

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱&#xff1a;5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.…

微带结环行器仿真分析+HFSS工程文件

微带结环行器仿真分析HFSS工程文件 工程下载&#xff1a;微带结环行器仿真分析HFSS工程文件 我使用HFSS版本的是HFSS 2024 R2 参考书籍《微波铁氧体器件HFSS设计原理》和视频微带结环行器HFSS仿真 1、环形器简介 环行器是一个有单向传输特性的三端口器件&#xff0c;它表明…

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C Qt开发&#xff1a;QNetworkAccessManager网络接口组件 阅读目录 1.1 …

在Ubuntu上运行QtCreator相关程序

背景&#xff1a;希望尝试在Linux系统上跑一下使用QtCreator相关的程序&#xff0c;因为有一些工作岗位要求有Linux上使用Qt的经验。 (1)我是把Windows上的程序移过来的&#xff0c;Windows上文件名称是不区分大小写的。 而Ubuntu上是区分的 所以一部分头文件需要进行修改&am…

idea创建SpringBoot项目

目录 1. 新建一个SpringBoot项目 2. 使用Springboot官网创建项目 3. 使用阿里云地址创建SpringBoot项目 4. 使用maven创建SpringBoot项目 5. 在Idea中隐藏指定文件/文件夹 1. 新建一个SpringBoot项目 Springboot2 要求jdk版本: 1.8 maven: 3.3 内嵌的tomcat: tomcat9 我们…

深度学习(一)-感知机+神经网络+激活函数

深度学习概述 深度学习的特点 优点 性能更好 不需要特征工程 在大数据样本下有更好的性能 能解决某些传统机器学习无法解决的问题 缺点 小数据样本下性能不如机器学习 模型复杂 可解释性弱 深度学习与传统机器学习相同点 深度学习、机器学习是同一问题不同的解决方法 …

11.5.软件系统分析与设计-面向对象的程序设计与实现

面向对象的程序设计与实现 设计模式 Java代码 C代码

SQL进阶技巧:每年在校人数统计 | 区间重叠问题

目录 0 问题分析 1 数据准备 2 问题分析 3 小结 区间重叠问题 0 问题分析 有一个录取学生人数表 in_school_stu,记录的是每年录取学生的人数及录取学生的学制,计算每年在校学生人数。 1 数据准备 create table in_school_stu as ( select stack(5,1,2001,2,1200,2,2000…

UML的图及其他图补充

一、UML图 1.类图 ‌类图‌是统一建模语言&#xff08;UML&#xff09;中的一种静态结构图&#xff0c;主要用于描述软件系统的静态结构。它显示了模型中的类、类的内部结构以及它们与其他类的关系。类图是面向对象建模的主要组成部分&#xff0c;用于对系统的词汇进行建模、对…

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失&#xff0c;在SigLIP这个工作中&#xff0c;作者提出采用非对比性的sigmoid损失&#xff0c;能够更高效地进行图文预训练&#xff0c;本文进行…