【C语言】文件操作(2)
一、文件的随机读写
在前面我们学习了文件的顺序读写的函数,那么当我们要读取某个指定位置的内容的时候,是否只能顺序的读取到这个内容?还有在对文件进行输入的时候,需要对指定的位置进行写入,那么此时应该怎么办呢?
我们也可以使用函数来更改读写的位置的,从而实现随机读写。
1、fseek函数
fseek函数是用来定义文件内容的光标,光标是默认在文件的开头的,我们前面使用的顺序读写的函数,其是使用一次后,光标是会向后移动一个位置的。·而fseek函数可以通过偏移量来定位光标,然后再从这个位置进行读写。
原型:
int freek(FILE*stream,long int offset,int origin );
如果函数定位成功,那么就会返回0, 如果返回失败就返回一个非0的值。
其第一个参数是我们要定位光标的流,第二个参数是偏移量,第二个参数要看我们第三个参数来定。
然后第三个参数可以取下面的三个值:
当其取SEEK_SET的时候,光标的偏移量要从文件的头部开始计算,当其为SEEK_CUR的时候,那么光标的偏移量要从当前光标的位置开始计算,当这个值为SEEK_END的时候,那么光标的偏移量就要从尾部开始计算。
下面我们通过一个例子来理解:
我们一个文件存储着hello五个字符,然后我们此时的光标在h后面的这个位置,然后我们要获取第四个位置的字符,那么我们就要将这个光标移动到第四个字符前面的位置。但是我们要看第三个参数的值是什么才可以确定这个偏移量。
当origin的值为SEEK_SET的时候,那么我们的光标就要从头开始移动,那么我们此时的光标的偏移量应该为3才可以。
当origin的值为SEEK_CUR的时候,那么我们的光标就是从当前的位置开始计算,那么我们此时的偏移量应该为2。
当origin的值为SEEK_END的时候,那么我们的光标就会从尾部开始计算,那么我们此时的偏移量应该为-2。
所以第二个参数的值要看第三个参数的值来决定。
下面我们通过代码来实际操作:
上面这个程序,首先我以文本写的方式打开了这个文件,然后我们使用fputs函数对这个文件进行写入一个字符串,然后我们使用fseek函数对其进行随机读写,首先我们看第三个参数,此时我们的第三个参数是SEEK_SET,那么此时我们是从头开始计算偏移量,然后我们第二个参数是我们此时的偏移量,那么我们的是9,那么就使得光标此时移动到偏移量为9的位置,那么此时的光标就在n的位置的前,那么我们再使用fputs函数,从这个位置对其进行写入,我们这个写入是会将原来的内容覆盖的,还有就是空白符也是一个位置的,然后我们就将原来的内容进行修改了。
下面我们运行代码看看文件修改后的内容:
可以看到我们文件的内容就被修改成这样了。
但是我们发现这个函数还是有点不方便,就是这个偏移量的计算,如果我们一个一个数非常不方便,还有就是我们有时对于空白的地方是几个位置是不好数的。那么有没有啥是可以帮助我们计算在这个偏移量的?
下面我们就学习这个可以帮助我们计算偏移量的函数:ftell函数。
2、ftell函数
这个函数的作用就是将当前光标的位置到文件开头的偏移量返回。
原型:
long int ftell(FILE*stream);
其还是原型还是很简单的,其参数就是我们要进行操作的流,然后返回值是一个长整型,返回值就是当前这个文件的光标到开头的偏移量。
我们来使用这个函数来看看其使用效果:
运行结果:
我们先来分析一下上面的代码,首先我们以文本读的方式打开这个文件,然后我们将这个光标移动到这个文件的尾部,然后我们使用ftell函数计算当前的光标的位置到文件头部的偏移量,那么得到的就是我们这个文件内容的字节数,刚刚好是16个字节。
3、rewind函数
这个函数的功能就是将文件中的指针回到开始的位置,也就是将这个光标重新回到开头处。
原型:
void rewind(FILE*stream);
它的参数就是我们要进行操作的流,其功能就是将文件中的光标移动到开头。
下面我们使用这个函数:
下面我们分析一下这段代码:
我们首先以读写的方式打开这个文件,然后我们使用一个循环,将大写字母A~Z的字符写入到我们的文件中,此时我们的文件的光标就应该在尾部了,然后我们再使用rewind函数,那么此时我们的光标就处于开头处了,然后我们又使用fread函数将这个文件的内容读取出来,存放在字符数组buffer中,然后我们关闭这个文件,将这个数组的内容打印出来:
运行结果:
可以发现这个数组存放的内容就是文件的内容。
不过上面还有一个问题就是,fread函数是对二进制文件进行操作的,那么我们通过上面的例子就可以发现,这个函数对于文本文件也是可以读取文本文件的。
那么fwite函数其实也可以对文本文件进行操作的。
二、文本读取结束的判断
1、被错误使用的feof
牢记:在文本读取中,不能使用feof函数的返回值来直接判断文本的读取是否结束。
feof函数的作用是当文件读取结束的时候,判断的是读取结束的原因,是否是读取到结尾结束。
那么其使用的前提是:文件读取已经结束了。
2、判断文件读取结束的方法
我们对于不同的文件,有其对应的方法:
(1)文本文件
根据我们的读取函数的返回值来确定,前面我们学习的到了文件读取的函数。
判断fgetc函数的返回值是否为EOF
判断函数fgets的返回值是否为NULL
(2)二进制文件
freacd函数判断返回值是否小于实际要读的个数。
3、判断文件读取结束的原因
我们上面学习了判断文件读取结束的方法,那么就是说,文件读取结束不一定就是正常的,那么有那些错误读取结束呢?
首先正常读取是文件读取到了文件的末尾处。
错误读取就是因为某种原因导致文件读取中途就结束了读取。
我们判断读取是否正常就使用feof函数和ferror函数。
feor这个函数我们上面已经介绍过了。
其原型如下:
int feof(FILE*stream);
ferror函数是在文件读取结束后,用来判断文件是否是错误读取结束,其原型如下:
int ferror(FILE*stream);
它是参数是要操作的流,如果文件是错误读取结束,那么就返回一个非0值,如果没有错误结束,那么就返回0
下面我们通过实例来理解:
那么在上面我们使用一个循环对这个文件进行读取,然后使用feof函数进行判断,如果其返回值是非0值,那么就说明其是非正常结束,如果是0那么就说明是正常结束。
三、文件缓冲区
我们在对文件进行写入操作的时候,这时候如果我们点进这个文件看的时候,我们写入的内容并不是立马就在文件中出现的,而我们关闭文件后,再重新打开这个文件,此时就可以在文件中找到我们写入的内容了。
这就得知道我们的文件缓冲区的内容了。
ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓 冲区的⼤⼩根据C编译系统决定的。
相关文章:
【C语言】文件操作(2)
一、文件的随机读写 在前面我们学习了文件的顺序读写的函数,那么当我们要读取某个指定位置的内容的时候,是否只能顺序的读取到这个内容?还有在对文件进行输入的时候,需要对指定的位置进行写入,那么此时应该怎么办呢&a…...
将内网的IP地址映射到外网的几种方案
文章目录 1. 背景与目标2. 核心方案选型3. 方案A:路由器端口映射(详细步骤)3.1 前置条件3.2 配置流程3.3 验证访问 4. 方案B:云平台NAT网关配置(以阿里云为例)4.1 前置条件4.2 配置流程4.3 验证访问 5. 方案…...
基于深度学习的图像超分辨率技术研究与实现
一、引言 在数字图像处理领域,图像超分辨率技术一直是一个备受关注的热点话题。随着人们对图像质量要求的不断提高,如何将低分辨率图像提升到高分辨率,同时保持图像的细节和清晰度,成为了一个极具挑战性的问题。传统的图像超分辨率技术主要依赖于插值方法,如双线性插值、双…...
A股复权计算_权息数据整理
目录 前置: 步骤: 1 以通达信为参照 2 从优矿获取所需数据 2.1 股票配股信息 2.2 股票分红信息 2.3 股票拆股信息 3 合并数据,制成权息数据表 权息数据截止20250329.7z 视频 前置: 1 本系列将以 “A股复权计算_” 开头…...
如何进行Prompt调优?
一. 神奇的咒语 在输入prompt前,加入下面这一段“神奇的咒语”,中文或者英文,就能帮你优化提示词。 I want you to become my Expert Prompt Creator. Your goal is to help me craft the best possible prompt for my needs. The prompt yo…...
Git Tag 详解:版本管理与实战指南
文章目录 Git Tag 详解:版本管理与实战指南1. Git Tag 的类型2. Git Tag 的常见操作(1) 创建标签① 创建轻量标签② 创建附注标签③ 给指定的提交打标签 (2) 查看标签(3) 删除标签(4) 推送标签到远程① 推送单个标签② 推送所有标签 (5) 删除远程标签 3. 使用 Tag 的…...
从零开始打造HTML5拼图游戏:一个Canvas实战项目
从零开始打造HTML5拼图游戏:一个Canvas实战项目 先看效果: 你是否曾经被那些精美的网页拼图游戏所吸引?用 HTML5 的 Canvas 技术,从零开始,教你怎么画图、处理鼠标事件,还有游戏的核心逻辑,…...
【数据分享】2000—2024年我国乡镇的逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)
之前我们分享过2000-2024年我国逐年的归一化植被指数(NDVI)栅格数据,该逐年数据是取的当年月归一化植被指数(NDVI)的年最大值!另外,我们基于此年度栅格数据按照行政区划取平均值,得到…...
设计模式 Day 2:工厂方法模式(Factory Method Pattern)详解
继 Day 1 学习了单例模式之后,今天我们继续深入对象创建型设计模式——工厂方法模式(Factory Method)。工厂方法模式为对象创建提供了更大的灵活性和扩展性,是实际开发中使用频率极高的一种设计模式。 一方面,我们将简…...
TensorFlow SegFormer 实战训练代码解析
一、SegFormer 实战训练代码解析 SegFormer 是一个轻量级、高效的语义分割模型,结合了 ViT(视觉 Transformer) 和 CNN 的高效特征提取能力,适用于边缘 AI 设备(如 Jetson Orin)。下面,我们深入…...
51c嵌入式~单片机~合集7~※
我自己的原文哦~ https://blog.51cto.com/whaosoft/13692314 一、芯片工作的心脏--晶振 在振荡器中采用一个特殊的元件——石英晶体,它可以产生频率高度稳定的交流信号,这种采用石英晶体的振荡器称为晶体振荡器,简称晶振。 制作方法 …...
私有知识库 Coco AI 实战(一):Linux 平台部署
Coco AI 是一个完全开源、跨平台的统一搜索和生产力工具,能够连接各种数据源,包括应用程序、文件、Google Drive、Notion、Yuque、Hugo 等,帮助用户快速智能地访问他们的信息。通过集成 DeepSeek 等大型模型,Coco AI 实现了智能个…...
大模型高质量rag构建:A Cheat Sheet and Some Recipes For Building Advanced RAG
原文:A Cheat Sheet and Some Recipes For Building Advanced RAG — LlamaIndex - Build Knowledge Assistants over your Enterprise DataLlamaIndex is a simple, flexible framework for building knowledge assistants using LLMs connected to your enterpris…...
LeetCode 78.子集
问题描述 给定一个不含重复元素的整数数组 nums,返回其所有可能的子集(幂集)。 示例 输入: nums [1,2,3] 输出: [ [], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3] ]解法:回溯算法 回溯是一种 暴力…...
变量(Variable)
免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:从小学解方程变量x,到中学阶段函数自变量x因变量y&…...
【STM32】最后一刷-江科大Flash闪存-学习笔记
FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口…...
Dify 深度集成 MCP实现灾害应急响应
一、架构设计 1.1 分层架构 #mermaid-svg-5dVNjmixTX17cCfg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5dVNjmixTX17cCfg .error-icon{fill:#552222;}#mermaid-svg-5dVNjmixTX17cCfg .error-text{fill:#552222…...
2025 年上半年软考信息系统项目管理师备考计划
2025 年上半年软考信息系统项目管理师备考计划 2025 年上半年软考信息系统项目管理师考试时间为 5 月 24 日 - 27 日,从现在开始备考,需合理规划,高效学习。以下为详细备考计划: 一、基础学习阶段(现在 - 4 月上…...
Scikit-learn使用指南
1. Scikit-learn 简介 定义: Scikit-learn(简称 sklearn)是基于 Python 的开源机器学习库,提供了一系列算法和工具,用于数据挖掘、数据预处理、分类、回归、聚类、模型评估等任务。特点: 基于 NumPy、SciP…...
学习大模型需要具备哪些技术、知识和基础
数学基础 概率论与数理统计:用于理解模型中的不确定性、概率分布,以及进行数据的统计分析、评估模型的性能等。例如,通过概率分布来描述模型预测结果的可信度,利用统计方法对数据进行抽样、估计模型的参数等。线性代数࿱…...
十五届蓝桥杯省赛Java B组(持续更新..)
目录 十五届蓝桥杯省赛Java B组第一题:报数第二题:类斐波那契数第三题:分布式队列第四题:食堂第五题:最优分组第六题:星际旅行第七题:LITS游戏第八题:拼十字 十五届蓝桥杯省赛Java B…...
Flink SQL Client bug ---datagen connector
原始sql语句如下 CREATE TABLE test_source (event_time TIMESTAMP(3), -- 事件时间(精确到毫秒)click INT, -- 随机数值字段WATERMARK FOR event_time AS event_time - INTERVAL 5 SECOND WITH (connector datagen, …...
股指期货的多头套期保值是什么意思?
多头套期保值,又叫“买入套期保值”,听起来很复杂,其实很简单。它的核心就是“提前锁定价格,防止未来价格上涨”。 举个例子,假设你是一家工厂的老板,过几个月要买一批原材料。现在原材料的价格是100元/吨…...
hadoop集群配置-scp命令
scp 命令用于在不同主机之间复制文件或目录,在Hadoop集群配置中常用于将配置文件或相关资源分发到各个节点。以下是 scp 命令的基本用法和在Hadoop集群配置中的示例: 基本语法 scp [-r] [源文件或目录] [目标用户目标主机:目标路径] - -r :…...
Redis 源码硬核解析系列专题 - 结语:从源码看Redis的设计哲学
1. 引言 通过前七篇的源码解析,我们从Redis的整体架构、核心数据结构、事件驱动模型,到内存管理、持久化、主从复制与集群模式,逐步揭开了Redis高性能与简洁性的秘密。本篇将总结这些技术细节,提炼Redis的设计哲学,并探讨如何将源码学习成果应用到实际开发中。 2. Redis的…...
解决QSharedPointer栈变量的崩溃问题
目录 参考崩溃代码现象 解决 参考 QSharedPointer的陷阱 qt中的共享指针,QSharedPointer类 崩溃 代码 #include <QtCore/QCoreApplication> #include <QDebug> #include <QSharedPointer>class MyClass { public:void doSomething() {qDebug…...
Lambda 表达式是什么以及如何使用
目录 📌 Kotlin 的 Lambda 表达式详解 🎯 什么是 Lambda 表达式? 🔥 1. Lambda 表达式的基本语法 ✅ 示例 1:Lambda 基本写法 ✅ 示例 2:使用 it 关键字(单参数简化) ✅ 示例 3…...
C++自定义迭代器
实现自己的迭代器 最近在写数据结构,使用类模板实现,碰到了一些问题,其中有一个就是遍历的问题,查阅资料最后实现了自己的迭代器,让我实现的数据结构能像STL一样进行for循环遍历。 类的构成 #include <stdexcept…...
PWA 中的 Service Worker:如何实现应用离线功能
前言 在当今快速发展的互联网时代,Progressive Web App (PWA) 正在逐步成为现代 Web 开发的主流选择。PWA 将 Web 应用和原生应用的最佳特性相结合,提供了丰富的用户体验。而在 PWA 的众多技术中,Service Worker 无疑是其核心组件之一。 作…...
dockerfile制作镜像
1.docker pull centos:centos7 2.dockerfile内容 FROM centos:centos7 #指定镜像维护的作者和邮箱 MAINTAINER csdn< **********qq.com #设置环境变量mypath ENV MYPATH /usr/local #设置进入容器的默认目录是/usr/local WORKDIR $MYPATH # 下载并替换 CentOS 镜像源 RUN …...
网络空间安全(46)DevSecOps概述
一、定义与核心理念 DevSecOps是“开发(Development)、安全(Security)和运营(Operations)”的结合,它将安全实践融入软件开发生命周期的每个阶段,从需求、设计、开发、测试到部署和运…...
LeetCode 211
实现支持通配符的字典树(Trie):解决单词匹配问题 一、问题描述 我们需要设计一个数据结构,支持以下功能: 添加新单词搜索字符串是否与任何已添加的单词匹配,其中搜索字符串可能包含通配符 .(…...
Docker Compose 启动jar包项目
参考文章安装Docker和Docker Compose 点击跳转 配置 创建一个文件夹存放项目例如mydata mkdir /mydata上传jar包 假设我的jar包名称为goudan.jar 编写dockerfile文件 vim app-dockerfile按键盘上的i进行编辑 # 使用jdk8 FROM openjdk:8-jre# 设置时区 上海 ENV TZAsia/Sh…...
利用deepseek直接调用其他文生图网站生成图片
这次deepseek输入中文后,其实翻译英文后,是可以丢到比如pollinations.这个网站,来生成图片,用法如下: 你是一个图像生成助手,请根据我的简单描述,想象并详细描述一幅完整的画面。 然后将你的详…...
远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
通过Docker下载Jupyter镜像部署,输入jupyter会发现 有几个版本,不知道怎么选?这几个版本有什么差别? 常见版本有: jupyter/base-notebookjupyter/minimal-notebookjupyter/scipy-notebookjupyter/datascience-notebo…...
11. 盛最多水的容器
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 最左右两边逐步往中间走,每次在左右中选取小的一个或–记录最大面积 提示:小白个人理解,如有错误敬请谅解! 二、外层配合操作…...
Selenium Web自动化如何快速又准确的定位元素路径,强调一遍是元素路径
如果文章对你有用,请给个赞! 匹配的ChromeDriver和浏览器版本是更好完成自动化的基础,可以从这里去下载驱动程序: 最全ChromeDriver下载含win linux mac 最新版本134.0.6998.165 持续更新..._chromedriver 134-CSDN博客 如果你问…...
Kotlin 基础语法解析
详细的 Kotlin 基础语法解析,结合概念说明和实用场景: --- ### **一、变量与常量** #### **1. 变量类型** - **val**(不可变变量):声明后不可重新赋值,类似 Java 的 final。 kotlin val name "Kotl…...
html 列表循环滚动,动态初始化字段数据
html <div class"layui-row"><div class"layui-col-md4"><div class"boxall"><div class"alltitle">超时菜品排行</div><div class"marquee-container"><div class"scroll-…...
【大模型基础_毛玉仁】5.4 定位编辑法:ROME
目录 5.4 定位编辑法:ROME5.4.1 知识存储位置1)因果跟踪实验2)阻断实验 5.4.2 知识存储机制5.4.3 精准知识编辑1)确定键向量2)优化值向量3)插入知识 5.4 定位编辑法:ROME 定位编辑:…...
Using SAP an introduction for beginners and business users
Using SAP an introduction for beginners and business users...
Android学习总结之RecyclerView补充篇
在 Android 开发中,列表数据更新的性能一直是关键痛点。传统的 notifyDataSetChanged() 会触发全量刷新,导致不必要的界面重绘。而 DiffUtil 作为 Android 提供的高效差异计算工具,能精准识别数据变化,实现局部更新,成…...
mapbox基础,使用geojson加载cluster聚合图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️circle点图层样式二、🍀使用geojson加…...
函数:static和extern
0.前言 在正式开始之前先说作用域和生命周期 作用域: 作用域有分为局部变量和全局变量 局部变量:一个变量仅在其中一段代码内起作用 全局变量:所有的代码都可以使用这个变量 生命周期: 生命周期是一个代码从运行开始到结束…...
【QT】练习1
1、设计一个颜色选择器,可以输入RGB的颜色值,点击确认,可以把主界面的背景颜色改成设置的颜色 修改背景颜色:setStyleSheet(“background-color 红绿蓝颜色值”); // mainwindow.cpp #include "mainwindow.h" #include…...
GreenPlum学习
简介 Greenplum是一个面向数据仓库应用的关系型数据库,因为有良好的体系结构,所以在数据存储、高并发、高可用、线性扩展、反应速度、易用性和性价比等方面有非常明显的优势。Greenplum是一种基于PostgreSQL的分布式数据库,其采用sharednothi…...
张量-pytroch基础(2)
张量-pytroch网站-笔记 张量是一种特殊的数据结构,跟数组(array)和矩阵(matrix)非常相似。 张量和 NumPy 中的 ndarray 很像,不过张量可以在 GPU 或其他硬件加速器上运行。 事实上,张量和 Nu…...
Linux多线程编程的艺术:封装线程、锁、条件变量和信号量的工程实践
目录 📌这篇博客能带给你什么? 🔥为什么需要封装这些组件? 一、线程封装 框架设计 构造与析构 1.线程创建 2.线程分离 3.线程取消 4.线程等待 二、锁封装 框架设计 构造与析构 1.加锁 2.解锁 3.RAII模式 三、条件…...
2025年智慧能源与控制工程国际学术会议(SECE 2025)
官网:www.ic-sece.com 简介 2025年智慧能源与控制工程国际学术会议(SECE 2025)将于2025年4月18日线上会议形式召开,这是一个集中探讨全球智慧能源和控制工程领域创新和挑战的国际学术平台。旨在汇集全球领域内的学者、研究人员、…...
Android 16开发实战指南|锁屏交互+Vulkan优化全解析
一、环境搭建与项目初始化 1. 安装Android Studio Ladybug 下载地址:Android Studio官网关键配置: # 安装后立即更新SDK SDK Manager → SDK Platforms → 安装Android 16 (Preview) SDK Manager → SDK Tools → 更新Android SDK Build-Tools至34.0.0 # 通过命令行安装SDK组…...