当前位置: 首页 > news >正文

【C语法学习】20 - 文件访问顺序

文章目录

  • 0 前言
  • 1 文件位置指示符
  • 2 rewind()函数
    • 2.1 函数原型
    • 2.2 参数
    • 2.3 返回值
    • 2.4 使用说明
  • 3 ftell()函数
    • 3.1 函数原型
    • 3.2 参数
    • 3.3 返回值
  • 4 fseek()函数
    • 4.1 函数原型
    • 4.2 参数
    • 4.3 返回值
  • 5 示例
    • 5.1 示例1
    • 5.2 示例2

0 前言

C语言文件访问分为顺序文件访问和随机文件访问。

1 文件位置指示符

关于文件位置指示符:

  1. 每个打开的文件都有一个相关联的文件位置指示符;
  2. 文件位置指示符指明在文件中进行读写操作的位置;
  3. 位置以偏离文件开头(第一个字节)的字节数表示,文件开头的位置为0;
  4. 以a、ab、a+、ab+模式打开现有文件时,文件位置指示符位于文件末尾;
  5. 以r、rb、w、wb、r+、rb+、w+、wb+模式打开现有文件时,文件位置指示符位于文件开头;
  6. 文件读写操作发生在位置指示符所标注的位置,并更新位置指示符。

2 rewind()函数

2.1 函数原型

rewind():把文件位置指示符设置至文件开头,函数原型如下:

void rewind(FILE *stream);

2.2 参数

rewind()函数只有一个参数stream:

  1. 参数stream是一个指向FILE类型结构的指针(fopen()函数的返回值)。

2.3 返回值

rewind()函数的返回值为空void。

2.4 使用说明

在不关闭文件的情况下,调用rewind()函数后,文件的位置指示符被设置到文件的开头0字节处;此时,可以从文件开头处开始,重新读取文件数据。

3 ftell()函数

3.1 函数原型

ftell():获取文件位置指示符的当前位置,函数原型如下:

long int ftell(FILE *stream);

3.2 参数

ftell()函数只有一个参数stream:

  1. 参数stream是一个指向FILE类型结构的指针(fopen()函数的返回值)。

3.3 返回值

ftell()函数返回值类型为long型:

  1. 获取成功,返回文件位置指示符的当前位置,指出当前读写位置偏离文件开头多少字节;
  2. 获取失败,返回-1L。

4 fseek()函数

4.1 函数原型

fseek():设置文件位置指示符的位置,函数原型如下:

int fseek(FILE *stream, long offset, int origin);

4.2 参数

fseek()函数有三个参数:

  1. 参数stream:指向FILE类型结构的指针(fopen()函数的返回值);
  2. 参数offset:文件位置指示符相对起始位置origin的偏移量,以字节为单位,类型为long型;offset为正时,向后移动;offset为负时,向前移动;
  3. 参数origin:文件位置指示符偏移量offset的起始位置,类型为int型。

origin有三种取值,如下图所示:

在这里插入图片描述

4.3 返回值

fseek()函数的返回值为int型:

  1. 设置成功,返回0;
  2. 设置失败,返回非0值。

C语言标准描述如下:

1. If successful, fseek returns 0. 
2. Otherwise, it returns a nonzero value. 

5 示例

5.1 示例1

验证rewind函数是否将文件位置指示符设置至文件开头,示例代码如下所示:

#define BUFLEN 6
int main()
{//char msg[] = "abcdefghijklmnopqrstuvwxyz";FILE* fp;char buf[BUFLEN] = { 0 };//if ((fp = fopen("1.txt", "w")) == NULL){printf("Failed to open file.\n");exit(1);}//if ((fputs(msg, fp)) == EOF){printf("Failed to write file.\n");exit(1);}//fclose(fp);//if ((fp = fopen("1.txt", "r")) == NULL){printf("Failed to open file.\n");exit(1);}printf("After open file, position = %ld\n", ftell(fp));//fgets(buf, BUFLEN, fp);printf("After read sting %s, position = %ld\n", buf, ftell(fp));//fgets(buf, BUFLEN, fp);printf("After read sting %s, position = %ld\n", buf, ftell(fp));//rewind(fp);printf("After rewind, position = %ld\n", ftell(fp));//fgets(buf, BUFLEN, fp);printf("After read sting %s, position = %ld\n", buf, ftell(fp));//fclose(fp);return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

5.2 示例2

使用fseek()函数设置文件位置指示符,示例代码如下所示:

#define MAX 50int main()
{//变量定义FILE* fp;int data = 0;int count = 0;int arr[MAX] = { 0 };long offset;int  dir = 0;//初始化数组for (count = 0; count < MAX; count++){arr[count] = count * 10;}//打开文件if ((fp = fopen("1.dat", "wb")) == NULL){printf("Failed to open file.\n");exit(1);}//写文件if ((fwrite(arr, sizeof(int), MAX, fp)) != MAX){printf("Failed to write file.\n");exit(1);}//关闭文件fclose(fp);//打开文件if ((fp = fopen("1.dat", "rb")) == NULL){printf("Failed to open file.\n");exit(1);}//读文件while (1){//printf("请输入读取方向(1-正向,2-反向):>\n");scanf("%d", &dir);if (dir != 1 && dir != 2){continue;}//printf("请输入数组元素的下标:>\n");scanf("%ld", &offset);if (offset < 0){break;}else if(offset > MAX - 1){continue;}//if (dir == 1){if ((fseek(fp, (offset * sizeof(int)), SEEK_SET)) != 0){printf("Failed to use fseek().\n");exit(1);}}else if (dir == 2){if ((fseek(fp, (-offset * sizeof(int)), SEEK_END)) != 0){printf("Failed to use fseek().\n");exit(1);}}//fread(&data, sizeof(int), 1, fp);//printf("arr[%ld] = %d\n", offset, data);}//关闭文件fclose(fp);return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

相关文章:

【C语法学习】20 - 文件访问顺序

文章目录 0 前言1 文件位置指示符2 rewind()函数2.1 函数原型2.2 参数2.3 返回值2.4 使用说明 3 ftell()函数3.1 函数原型3.2 参数3.3 返回值 4 fseek()函数4.1 函数原型4.2 参数4.3 返回值 5 示例5.1 示例15.2 示例2 0 前言 C语言文件访问分为顺序文件访问和随机文件访问。 …...

Etcd 常用命令与备份恢复

1. etcd简介 官方网站&#xff1a;etcd.io 官方文档&#xff1a;etcd.io/docs/v3.5/op-guide/maintenance 官方硬件推荐&#xff1a;etcd.io/docs/v3.5/op-guide/hardware github地址&#xff1a;github.com/etcd-io/etcd etcd是CoreOS团队于2013年6月发起的开源项目&#xf…...

获取任意时间段内周、季度、半年的二级联动

#需求是获取两个时间内 年周 、年季度、年半年的二级联动# 找了半天也找不到什么有用的信息 就自己简单写了一个 思路是先获取年的列表再去嵌套查询 根据前端VUE提供的格式嵌套 public function getDate(){$leixing Request::param(leixing);$larr array(1,2,3,4);if(empty(…...

前端面试系列之工程化篇

如果对前端八股文感兴趣&#xff0c;可以留意公重号&#xff1a;码农补给站&#xff0c;总有你要的干货。 前端工程化 Webpack 概念 本质上&#xff0c;webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个…...

京东按关键词搜索商品列表接口:竞品分析,商品管理,营销策略制定

京东搜索商品列表接口是京东开放平台提供的一种API接口&#xff0c;通过调用该接口&#xff0c;开发者可以获取京东平台上商品的列表数据&#xff0c;包括商品的标题、价格、库存、月销量、总销量、详情描述、图片等信息。 接口的主要作用包括&#xff1a; 市场调研&#xff…...

Microsoft Dynamics 365 CE 扩展定制 - 9. Dynamics 365扩展

在本章中,我们将介绍以下内容: Dynamics 365应用程序Dynamics 365通用数据服务构建Dynamics 365 PowerApp使用Flow在CDS和Dynamics 365之间移动数据从AppSource安装解决方案使用数据导出服务解决方案进行数据复制从CRM数据构建Power BI仪表板简介 多年来,Dynamics CRM已从一…...

多篇论文介绍-Wiou

论文地址 目录 https://arxiv.org/pdf/2301.10051.pdf 01 CIEFRNet&#xff1a;面向高速公路的抛洒物检测算法 02改进 YOLOv5 的 PDC 钻头复合片缺损识别 03 基于SimAM注意力机制的DCN-YOLOv5水下目标检测 04 基于改进YOLOv7-tiny 算法的输电线路螺栓缺销检测 05 基于改…...

Django介绍,安装,创建

文章目录 1. web应用程序1.1 什么是web?1.2 web应用程序的优点1.3 web应用程序的缺点1.4 什么是web框架&#xff1f; 2. 手撸web框架 1. web应用程序 1.1 什么是web? Web应用程序是一种可以通过Web访问的应用程序,用户只需要有浏览器即可&#xff0c;不需要再安装其他软件 案…...

Java通过javacv获取视频、音频、图片等元数据信息(分辨率、大小、帧等信息)

相信我们都会或多或少需要给前端返回视频或者音频的一些信息,那么今天这篇文章通过Java语言使用javacv来获取视频、音频、图片等元数据信息(分辨率、大小、帧等信息) 一、首先导入依赖 可以先导入javacv/javacv-platform依赖,由于依赖比较大,所以我们可以先去除部分不需…...

flask和fastapi的区别以及demo实现

flask和fastapi的区别以及demo实现 flask和fastapi的区别fastapi简单demoFastAPI包括全局异常捕捉和参数验证的demoflask和fastapi的区别 Flask:Flask是一个轻量级的Web框架,它提供了最基本的工具,可以自由选择其他库和组件来构建应用。灵活性:Flask允许用户自由选择数据库、…...

python特殊循环队列_队中元素个数代替队尾指针

对于循环队列来说&#xff0c;如果知道队头指针和队中元素个数&#xff0c;则可以计算出队尾指针。也就是说&#xff0c;可以用队中元素个数代替队尾指针。设计出这种循环队列的判队空、进队、出队和取队头元素的算法。 本例的循环队列包含data 数组、队头指针 front和队中元素…...

什么是观察者模式?用 Python 如何实现 Observer(观察者或发布订阅)对象行为型模式?

什么是观察者模式&#xff1f; 观察者模式&#xff08;Observer pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象之间建立一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;其相关依赖对象都会得到通知并自动更新。 在观察者模式中&am…...

pytorch直线拟合

目录 1、数据分析 2、pytorch直线拟合 1、数据分析 直线拟合的前提条件通常包括以下几点&#xff1a; 存在线性关系&#xff1a;这是进行直线拟合的基础&#xff0c;数据点之间应该存在一种线性关系&#xff0c;即数据的分布可以用直线来近似描述。这种线性关系可以是数据点…...

相机传感器

相机的传感器大小通常用英寸&#xff08;1英寸2.54厘米&#xff09;来表示。例如&#xff1a;全画幅相机的传感器大小为&#xff1a;36mm*24mm&#xff0c;称为 35mm全画幅。 几分之一英寸 所谓的 1/2.7&#xff0c;1/2.5等等&#xff0c;里面的分子1是一个标准&#xff0c;分…...

大语言模型的关键技术

大语言模型的关键技术&#xff1a; 经过漫长的发展&#xff0c;LLM 进化到了当前的状态——通用且有能力的学习者。在这个过程中&#xff0c;人们提出了许多重要的技术&#xff0c;大大提升了 LLM 的能力。在此&#xff0c;我们简要列举了几种重要的技术&#xff0c;这些技术&a…...

uniapp使用vur-cli新建项目并打包

新建项目 npm install -g vue/cli vue create -p dcloudio/uni-preset-vue my-project选择默认模板npm run dev:h5 运行 安装sass和uview &#xff08;npm安装失败&#xff09; bug&#xff1a;使用uni.scss中的变量或样式&#xff0c;<style lang"scss"> 必…...

后台管理系统解决方案-中大型-Vben Admin

后台管理系统解决方案-中大型-Vben Admin 官网 Vben Admin 在线演示 Vben Admin 为什么选择它 github现有20K星&#xff0c;并且它有个可视化生成表单&#xff0c;我很喜欢 快速开始 # 拉取代码 git clone https://github.com/vbenjs/vue-vben-admin-doc# 安装依赖 yarn#…...

通俗理解repartition和coalesce区别

官方的解释 reparation 返回一个具有恰好numPartitions分区的新RDD。 可以增加或减少此RDD中的并行级别。在内部,reparation会使用shuffle来重新分发的数据。 如果要减少此RDD中的分区数量,请考虑使用coalesce,这样可以避免执行shuffle。 coalesce 返回一个新的RDD,该RDD被…...

优雅设计之美:实现Vue应用程序的时尚布局

本文为翻译文章&#xff0c;原文链接&#xff1a; ** https://fadamakis.com/clean-layout-architecture-for-vue-applications-a738201a2a1e 前言 页面布局是减少代码重复和创建可维护且具有专业外观的应用程序的基本模式。如果使用的是Nuxt&#xff0c;则可以提供开箱即用…...

05预测识别-依托YOLO V8进行训练模型的识别——对视频中的目标进行跟踪统计

上文中详细介绍了如何对视频进行抽帧,并对帧的图像进行目标识别。但在日常工作中,我们也会遇到需要对目标进行跟踪统计的情况,比如我们需要连续统计某一类目标有多少个的时候,如果单纯从帧中抽取图像的话,系统将无法判断是否为同一目标,从而造成目标数量统计的重复,导致…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...