C语言| 文件操作详解(二)

目录

四、有关文件的随机读写函数

4.1 fseek

4.2 ftell

4.3 rewind

五、判定文件读取结束的标准与读写文件中途发生错误的解决办法

5.1 判定文件读取结束的标准

5.2 函数ferror与feof

5.2.1 函数ferror

5.2.2 函数feof 


在上一章中,我们主要介绍了文件类型指针如何打开与关闭文件什么是流与标准流,以及提到的部分顺序读写函数

C语言| 文件操作详解 (一)

这篇文章为上篇文章的续,将对有关文件随机读写的函数 fseek、ftell 、rewind 进行介绍,并解释判定文件读取结束的标准与读写文件中途发生错误的解决办法

四、有关文件的随机读写函数

4.1 fseek

介绍:该函数主要用于改变文件中光标(就是我们打字的时候一闪一闪的小竖线)的位置,(这里说光标是为了便于理解,实际上是文件指针),再利用相关函数输入内容后,新内容会覆盖在该位置上的原内容。

例如,在打开的某个文件中有以下内容:“abcdef”,其中光标在‘c’之后(即相对于文件起始光标位置,偏移量为3),此时利用fputc在文件上打印一个字母m,则文件内容最终变为“abcmef”。

函数声明:

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

参数:

(1) 指向标识输入流的FILE对象的指针;

(2) 要从源偏移的字节数,即偏移量;

(3) 偏移量所参考的起始位置,即源的值;

对于参数(3),源的位置值,我们一般填入下表中三个常量的一个。

常量参考位置
SEEK_SET文件开头
SEEK_CUR文件指针的当前位置
SEEK_END文件末尾

返回值:

成功则返回0,否则返回非0值;如果发生读取或写入错误,则会设置错误指示符。

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{	FILE* pf = fopen("233.txt", "w");fputs("There has a boy", pf);fseek(pf, 12, SEEK_SET);fputc('g', pf);fputc('i', pf);fputc('r', pf);fputc('l', pf);fclose(pf);return 0;
}

4.2 ftell

介绍:该函数用于返回文件指针相对于起始位置的偏移量。

函数声明:

long int ftell ( FILE * stream ) ;

参数:

指向标识流的FILE对象的指针

返回值:

成功则返回相对于文件指针初始位置的偏移量,失败则返回-1L;

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{	FILE* pf = fopen("example.txt", "rb");long long size = 0;if (pf == NULL)perror("Error opening file");else {fseek(pf, 0, SEEK_END);size = ftell(pf);fclose(pf);printf("该文件的大小为%ld字节\n",size);}return 0;
}

PS:

顺便解释一下为什么上述代码可以检测文件的字节大小,因为一个字符占一个偏移量,只要得到文件末尾相对于文件初始位置的偏移量 ,就可以得到文件的字符数,而一个字符占一个字节(char型),所以可以得到文件的字节大小。

4.3 rewind

介绍:该函数用于将文件指针的位置重置为文件的起始位置

函数声明:

void rewind ( FILE * stream ) ;

参数:

指向标识流的FILE对象的指针

返回值:

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{	FILE* pf = fopen("123456.txt", "w+");char arr[100];fputs("fufu is very cute!", pf);rewind(pf);fgets(arr,sizeof(arr)/sizeof(arr[0]), pf);printf("%s",arr);fclose(pf);return 0;
}

五、判定文件读取结束的标准与读写文件中途发生错误的解决办法

5.1 判定文件读取结束的标准

如何判断文件读取结束?其实是一个很简单的问题。

一般来说,我们使用的有关文件读取的函数,对于文本文件,如果它的返回值是EOF(例如fgetc),或者NULL(例如fgets),则代表文件内容读取结束。

而如果是二进制文件,则是看返回值是否小于实际要读取的个数(例如fread)

5.2 函数ferror与feof

但有些时候,文件会因为各种各样的代码问题导致文件中途读写失败,如何得知哪个函数出现问题,又如何判断文件是否因为到达文件尾而读取结束?接下来我们介绍两个函数,它们可以解决我们的疑问。

5.2.1 函数ferror

函数声明:

int ferror( FILE* stream );

函数参数:

指向标识流FILE对象的指针

返回值:

如果设置了与流关联的错误指示器,则返回非零值,否则返回0

解释:

在上篇文章与这篇文章中我们介绍的函数,绝大多数遇到错误,都会设置错误指示器,如果在每一个有关文件读写的函数后面都加一个if利用ferror进行判断,就可以知道在哪里出了问题。

例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{FILE* pf;pf = fopen("myfile.txt", "r+");//注释if (pf == NULL) perror("Error opening file");else {char a=fgetc(pf);if (ferror(pf)) {printf("Error Reading to myfile.txt\n");exit(3);}fputc('x', pf);if (ferror(pf)) {printf("Error Writing to myfile.txt\n");exit(2);}          fclose(pf);}return 0;
}

 我们先将代码复制到工程中,然后在工程文件的目录下创建名为“myfile”的txt类型文件,并输入如下内容:

1.如果将注释一行的“r+”更改为“r”,运行程序,结果为:

2. 如果将注释一行的“r+”更改为“w”,运行程序,结果为:

根据ferror函数与运行结果, 我们就可以锁定问题出现在文件的读写方式上。

3. 如果不进行更改,运行程序,结果为:

5.2.2 函数feof 

函数声明:

int feof ( FILE* stream);

参数:

指向标识流的FILE对象的指针

返回值:

如果设置了与流关联的文件结束指示器,则返回非零值,否则,返回0

解释:

如果正常到达文件末尾而结束读取,则会返回非0值,如果未到达文件末尾而结束读取,则会返回0,用于检查程序是否读取完整。

注意:

feof是用于判断文件读取结束的原因是否是到达文件末尾,千万不可在文件读取过程中使用feof!

例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main ()
{FILE * pFile;int n = 0;pFile = fopen ("myfile.txt","rb");if (pFile==NULL) perror ("Error opening file");else{while (fgetc(pFile) != EOF) {++n;}if (feof(pFile)) {puts ("End-of-File reached.");printf ("Total number of bytes read: %d\n", n);}else puts ("End-of-File was not reached.");fclose (pFile);}return 0;
}

此代码作用为:

打开名为“myfile.txt”的文件,并通过逐个读取所有字符来计算文件的字节数。该程序检查是否已到达文件末尾,如果已到达,则打印读取的总字节数。

小伙伴们可以自己试一下,我这里就不演示了。

本文完!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:管理和操作数据表

数据表是数据库的重要组成部分&#xff0c;每一个数据库都是由若干个数据表组成的。没有数据表就无法在数据库中存放数据。MySQL数据表的管理和操作是数据库管理员和开发人员日常工作中不可或缺的一部分。 创建数据表 CREATE 创建数据表的过程是规定数据列的属性的过程&#…

网工内推 | 云运维工程师,最高19K,五险一金加补充医疗险

01 云计算运维工程师 &#x1f537;岗位职责 1、负责客户云计算解决方案的运维&#xff0c;负责云计算解决方案中云、虚拟化工作&#xff1b; 2、负责客户现场H3C产品的日常问题处理、变更维护、巡检、版本升级等工作&#xff0c;保障客户网络的稳定运行&#xff1b; 3、协调…

揭秘智能工牌:如何成为房企销售团队的数字化转型加速器

在这个竞争激烈的市场环境中&#xff0c;房企想要脱颖而出&#xff0c;不仅需要优质的产品和服务&#xff0c;更需要高效的销售团队。而销售团队的能力提升&#xff0c;离不开精细化管理和科技的赋能。DuDuTalk智能语音工牌&#xff0c;正是这样一款融合了AI技术与销售实战智慧…

Python中的yieId,比return更高效!

本文旨在深入探索"yield"的基本原理和实际应用&#xff0c;帮助你理解为什么它在Python编程中如此重要。 一、深入理解Yield "yield"与常用的"return"有本质的区别。"yield"不是真正返回一个值并退出函数&#xff0c;而是暂停函数执行…

springboot报错

springboot报错&#xff1a;g.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1 解决办法&#xff1a; file->settings 搜索encoding 然后选择File encodings 也可以直接找 File encodings 全部都更改整utf-8&#xff…

8.1IO进程线程

笔记 进程 一.多进程引入 1.1引入目的 程序员写程序时&#xff0c;一个程序可能由多个任务组成&#xff0c;如果使用的是单进程&#xff0c;或单任务&#xff0c;那么该任务执行阻塞时&#xff0c;其他任务就无法执行&#xff0c;必须等到该任务解除阻塞后&#xff0c;才能…

2024上半年热门内容透视 | 品牌种草解析

2024年上半年&#xff0c;小红书平台“考公上岸”、“不确定性”、“重养自己一遍”、“人生是旷野”、“原生家庭顶配”等话题热议之下&#xff0c;透露着消费者怎样的需求&#xff1f; 综合热门内容及小红书用户的分享发现&#xff0c;变数和不确定性成为新常态&#xff0c;消…

基于OpenCV C++的网络实时视频流传输——Windows下使用TCP/IP编程原理

1.TCP/IP编程 1.1 概念 IP 是英文 Internet Protocol &#xff08;网络之间互连的协议&#xff09;的缩写&#xff0c;也就是为计算机网络相互连接进行通信而设计的协议。任一系统&#xff0c;只要遵守 IP协议就可以与因特网互连互通。 所谓IP地址就是给每个遵循tcp/ip协议连…

3D打印随形透气钢:模具困气终结者

困气是模具经常遇到的问题&#xff0c;是制约生产效率与产品质量的关键因素之一。传统透气钢材料虽有所助益&#xff0c;但其在加工复杂度、形状适应性及性能均衡性上的局限性明显。在此背景下&#xff0c;3D打印技术的革新性应用——随形透气钢应运而生&#xff0c;为困气、排…

NLP与搜广推常见面试问题

1 auc指标 AUC的两种意义 一个是ROC曲线的面积另外一个是统计意义。从统计学角度理解&#xff0c;AUC等于随机挑选一个正样本和负样本时&#xff0c;模型对正样本的预测分数大于负样本的预测分数的概率。下图为搜广推场景下的一个计算auc的例子 2 GAUC指标 就是在推荐系统…

字符设备驱动基础—sys文件系统,udev介绍,驱动模块在内核空间注册设备

文章目录 sys文件系统介绍设计思想应用和功能 udev介绍主要功能工作原理使用 udevadm 工具 设备文件创建流程驱动程序的注册device_create函数详解示例代码效果图 sys文件系统介绍 sysfs 是 Linux 内核中的一种虚拟文件系统&#xff0c;它为用户空间和内核之间提供了一种统一的…

Kafka基本概念,工作流程介绍

1、消息队列与Kafka 1.1、Kafka简介 Kafka使用scala开发&#xff0c;支持多语言客户端&#xff08;c、java、python、go等&#xff09; Kafka最先由LinkedIn公司开发&#xff0c;之后成为Apache的顶级项目。 Kafka是一个分布式的、分区化、可复制提交的日志服务 LinkedIn使…

SpringBoot中的server.context-path

一、问题引入 书接上回&#xff0c;SpringBoot 在 idea中的 .idea和 .iml文件-CSDN博客&#xff0c;我在boot-test的测试项目中使用的 SpringBoot版本为 1.3.5.RELEASE&#xff0c;新项目 cps-task中使用的版本为 2.4.8&#xff0c;造成了连接异常&#xff0c;问题很好解决&…

(20240801)矿山固废基胶凝材料及混凝土中文期刊整理

一、篇名:固废 级别:EI + 篇名:固废混凝土/水泥/胶砂/胶凝材料 级别:EI

二叉树LeetCode热题

94.二叉树的中序遍历 题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 输入&#xff1a;root [1,null,2,3]输出&#xff1a;[1,3,2] 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …

基于python的百度迁徙迁入、迁出数据分析(六)

书接上回&#xff0c;苏州市我选取了2024年5月1日——5月5日迁入、迁出城市前20名并求了均值&#xff0c;从数据中可以看出苏州市与上海市的关系还是很铁的&#xff0c;都互为对方的迁入、迁出的首选且迁徙比例也接近4分之一&#xff0c;名副其实的老铁了&#xff1b; 迁出城市…

Springboot学习-day16

Springboot学习-day16 Springboot是spring家族中的一个全新框架&#xff0c;用来简化spring程序的创建和开发过程。在以往我们通过SpringMVCSpringMybatis框架进行开发的时候&#xff0c;我们需要配置web.xml&#xff0c;spring配置&#xff0c;mybatis配置&#xff0c;然后整…

鸿蒙应用框架开发【JS注入与执行】 Web

JS注入与执行 介绍 本示例基于H5游戏&#xff0c;通过arkui的button实现对游戏实现基本控制&#xff0c;展示webview的JS注入与执行能力&#xff0c;及native应用与H5的通信能力。 效果预览 使用说明 1.设备连接热点&#xff0c;可访问互联网。 2.打开应用&#xff0c;通过…

RuoYi-3.0代码审计

1 第三方组件漏洞审计 本项目使用Maven构建的。因此我们直接看pom.xml文件引入了哪些组件。通过IDEA打 开该若依&#xff0c;发现本项目采用了多模块方式。因此每个模块下都会有一个pom.xml&#xff0c;项目 最外层的pom.xml为父POM。我们可以通过 pom.xml 或者 External Libr…