当前位置: 首页 > 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进行训练模型的识别——对视频中的目标进行跟踪统计

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

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

STL 2迭代器

文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器&#xff1f; 1.迭代器…...

持续交付的进化:从DevOps到AI驱动的IT新动能

文章目录 一、持续交付的本质&#xff1a;从手动到自动的交付飞跃关键特性案例&#xff1a;电商平台的高效部署 二、持续交付的演进&#xff1a;从CI到AI驱动的未来发展历程 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/101f72defaf3493ba0ba376bf09367a2.png)中国…...