椋鸟C语言笔记#34:文件的随机读写、文件读取结束或失败的判定、缓冲区

萌新的学习笔记,写错了恳请斧正。


目录

文件的随机读写

fseek

使用实例

ftell

使用实例

rewind

文件读取结束或失败的判定

feof

ferror

典型使用方式

文件缓冲区

fflush


文件的随机读写

文件的随机读写是指我们可以控制文件位置指示器(光标)的位置,以完成复杂的读写操作

fseek
#include <stdio.h>
int fseek( FILE* stream, long offset, int origin );

fseek函数用于移动文件位置指示器(光标)的位置,移动成功则返回0,发生错误则光标位置不变、返回非0整数并设置流结构体上的错误指示器

其中,origin是基准位置,可以取值有:SEEK_SET(文件头)、SEEK_CUR(当前光标位置)、SEEK_END(文件尾),一般这三个值分别是0、1、2(最好不要这样写)。而offset为偏移的字节数,代表以origin为基准偏移特定字符,比方说origin为SEEK_CUR且offset为-1时,就将光标左移一个字节。

使用实例

文件被写入“This is a sample.”

#include <stdio.h>
#include <stdlib.h>int main()
{FILE* pf = fopen("file.txt", "w");if (pf == NULL){perror("fopen");return EXIT_FAILURE;}fputs("This is an apple.", pf);fseek(pf, 9, SEEK_SET);fputs(" sam", pf);fclose(pf);pf = NULL;return EXIT_SUCCESS;
}
ftell
#include <stdio.h>
long ftell( FILE* stream );

ftell用于返回此时文件位置指示器相对文件头的偏移量

使用实例
#include <stdio.h>
#include <stdlib.h>int main()
{FILE* pf = fopen("file.txt", "w");if (!pf){perror("fopen");return EXIT_FAILURE;}fputs("1145141919810", pf);printf("%d\n", ftell(pf));fseek(pf, 0, SEEK_SET);printf("%d\n", ftell(pf));fseek(pf, 7, SEEK_CUR);printf("%d\n", ftell(pf));return EXIT_SUCCESS;
}
rewind
#include <stdio.h>
void rewind( FILE* stream );

rewind函数用于将文件位置指示器返回到文件起始位置

效果等于offset为0且origin为SEEK_SET的fseek函数

文件读取结束或失败的判定

feof
#include <stdio.h>
int feof( FILE *stream );

feof检查流结构体上的文件尾指示器,如果指示器被设置则返回非0值,否则返回0

feof函数的作用是:当文件读取结束,判断结束的原因是否是“遇到文件尾”

请不要在读取过程中使用feof的返回值来判断文件是否读到结束

ferror
#include <stdio.h>
int ferror( FILE* stream );

ferror检查流结构体上的错误指示器,如果指示器被设置则返回非0值,否则返回0

典型使用方式

先判断读取是否结束,如果读取结束则通过feof和ferror判断是遇到文件尾结束还是出错

  1. 判断文本文件是否结束:判断返回值是否为EOF(fgetc)或者NULL(fgets)
  2. 判断二进制文件读取结束:判断fread返回值是否小于实际要读的个数

比方说我们处理文本文件可以:

#include <stdio.h>
#include <stdlib.h>int main()
{FILE* fp = fopen("test.txt", "r");if (!fp){perror("File opening failed");return EXIT_FAILURE;}int c; // 注意:int,非char,要求处理EOFwhile ((c = fgetc(fp)) != EOF)  // 标准C I/O读取文件循环putchar(c);if (ferror(fp))puts("I/O error when reading.");else if (feof(fp))puts("End of file reached successfully.");fclose(fp);fp = NULL;return EXIT_SUCCESS;
}

处理二进制文件可以:

#include <stdio.h>
#include <stdlib.h>enum { SIZE = 5 };
double a[SIZE] = { 1.,2.,3.,4.,5. };
double b[SIZE];int main()
{FILE* fp = fopen("test.bin", "wb"); // 必须用二进制模式if (!fp){perror("fopen-wb");return EXIT_FAILURE;}fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组fclose(fp);fp = fopen("test.bin", "rb");if (!fp){perror("fopen-rb");return EXIT_FAILURE;}size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组if (ret_code == SIZE){puts("Array read successfully, contents: ");for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]);putchar('\n');}else{if (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp))perror("Error reading test.bin");} // error handlingfclose(fp);fp = NULL;return EXIT_SUCCESS;
}

文件缓冲区

ANSIC标准采用“文件缓冲系统”来处理数据文件。

也就是说,系统会在内存中为每个打开的文件流创建一个“文件缓冲区”。内存中运行的程序如果想对外存中的文件进行I/O(输入输出)操作,传递的信息就需要通过输入缓冲区和输出缓冲区。

在不刷新缓冲区的情况下,信息只有在填满整个输入/输出缓冲区后,整个缓冲区的信息才会整个打包发送给程序/文件,否则信息将滞留在缓冲区直到被刷新。

刷新缓冲区是指将已经写到输入缓冲区的信息冲入、已经写到输出缓冲区的信息冲出;将尚未写入缓冲区的信息舍弃

由于缓冲区的存在,我们在更新模式(存在标签"+")下打开文件时:

  • 若中间没有fflush函数或文件定位函数,则输出后不应有输入
  • 若中间没有文件定位函数且输入操作没有遇到文件尾,则输入后不应有输出
fflush
#include <stdio.h>
int fflush( FILE* stream );

fflush函数用于刷新缓冲区,成功返回0,否则返回EOF并设置流结构体的错误指示器

如果输入空指针,则刷新所有缓冲区


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

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

相关文章

QT 文本框的绘制与复选框组键

.cpp文件 #include "widget.h" #include "ui_widget.h"#include<QDebug> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//更改窗口标题setWindowTitle("我爱xyy");//更改图标setWindow…

使用VSCode内的jupyter编写R语言:绘制中国省份地区热力图

R语言绘制中国省份地区热力图教程 1、R语言的安装和编辑器的选择 对于一门从未接触过的编程语言&#xff0c;相信大家的吐槽点和我一样&#xff1a;又要安装软件&#xff0c;配置环境&#xff01;其实R语言的安装和环境配置并不复杂&#xff0c;只需要安装两部分内容&#xf…

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig&#xff1b;.&#xff1b;..&#xff1b;./boot) 指定脚本执行路…

【小笔记】用tsai库实现Rocket家族算法

2024.1.16 Rocket家族算法是用于时间序列分类的强baseline&#xff08;性能比较参考【小笔记】时序数据分类算法最新小结&#xff09;&#xff0c;Rocket/MiniRocket/MultiRocket官方都有开源实现&#xff0c;相比较而言&#xff0c;用tsai来实现有三个好处&#xff1a;1是快速…

WPF应用程序生存期以及相关事件

WPF 应用程序的生存期会通过 Application 引发的几个事件来加以标记&#xff0c;相关事件对应着应用程序何时启动、激活、停用和关闭。 应用程序生存期事件 • 独立应用程序(传统风格的 Windows 应用程序&#xff0c;这些应用程序作为要安装到客户端计算机并从客户端计算机运…

VitePress-01-从零开始的项目创建(npm版)

说明 本文介绍一下 VitePress的项目创建的步骤。 主要用到的命令工具是 npm。 本文的操作步骤是从无到有的创建一个完整的基本的【VitePress】项目。 环境准备 根据官方文档的介绍&#xff0c;截止本文发稿时&#xff0c;需要使用node.js 18 的版本。 可以使用node -v 的命令查…

关于java的封装

关于java的封装 我们在前面的文章中&#xff0c;了解到了类和对象的知识&#xff0c;以及做了创建对象的时候对内存的分析&#xff0c;我们本篇文章来了解一下面向对象的三大基本特征之一&#xff0c;封装&#x1f600;。 一、初识封装 封装就好比&#xff0c;我们把一些物品…

【操作系统】1. 操作系统概述

文章目录 【 1. 什么是操作系统 】【 2. 操作系统软件的分类 】【 3. 操作系统内核的抽象和特征 】3.1 操作系统内核的抽象3.2 操作系统内核的特征 【 1. 什么是操作系统 】 操作系统是管理硬件资源、控制程序运行、改善人机界面和为应用软件提供服务的一种系统 软件。一个服务…

<软考高项备考>《论文专题 - 71 风险管理(3)》

3 过程2-识别风险 3.1 问题 4W1H过程做什么是识别单个项目风险以及整体项目风险的来源&#xff0c;并记录风险特征的过程。作用:1、记录现有的单个项目风险&#xff0c;以及整体项目风险的来源:2、汇总相关信息&#xff0c;以便项目团队能够恰当地应对已识别的风险。为什么做…

怎么修改或移除WordPress后台仪表盘概览底部的版权信息和主题信息?

前面跟大家分享『WordPress怎么把后台左上角的logo和评论图标移除&#xff1f;』和『WordPress后台底部版权信息“感谢使用 WordPress 进行创作”和版本号怎么修改或删除&#xff1f;』&#xff0c;其实在WordPress后台仪表盘的“概览”底部还有一个WordPress版权信息和所使用的…

项目解决方案:“ZL铁路轨行车辆”实时视频监控系统

目 录 一、建设背景 1.1 政策背景 1.2 现状 二、建设目标 三、建设依据 四、建设原则 4.1经济高效性 4.2系统开放性 4.3系统继承性 4.4系统扩展性 4.5系统经济性 4.6系统安全性 五、系统架构 5.1系统架构图 5.2技术架构 1、DVS 2、中心管理服务…

Java:List相互转换数组

经常我们会遇到前端传服务端值为数组的时候我们需要对其转换成集合便于一些其它操作&#xff0c;删除&#xff0c;匹配等操作&#xff0c;今天我们就总结下数组集合相互转换的方法 1、Object[] objArray arrayList.toArray(); Slf4j public class BaseTest { Testpublic void…

【Java SE语法篇】11.异常

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 1. 异常的概念和体系结构1.1 异常的概念1.2 异常体系…

PTA——7-31 三角形判断

7-31 三角形判断 (15分) 给定平面上任意三个点的坐标(x​1​​,y​1​​)、(x​2​​,y​2​​)、(x​3​​,y​3​​)&#xff0c;检验它们能否构成三角形。 输入格式: 输入在一行中顺序给出六个[−100,100]范围内的数字&#xff0c;即三个点的坐标x​1​​、y​1​​、x​2​…

SUKER书客重磅发布全新系列:书客Sun立式护眼台灯,护眼养眼新境界

近日&#xff0c;国内知名的光学国货品牌——SUKER书客在2024年新品发布上&#xff0c;正式发布了全新系列的书客Sun立式护眼台灯。 SUKER书客作为近年来快速发展的创新型光学技术品牌&#xff0c;曾推出的一系列产品都取得了刷新行业标准的成绩&#xff0c;他们坚持以创新为动…

【51单片机系列】单片机与PC进行串行通信

一、单片机与PC机串行通信的设计 工业现场的测控系统中&#xff0c;常使用单片机进行监测点的数据采集&#xff0c;然后单片机通过串口与PC通信&#xff0c;把采集的数据串行传送到PC机上&#xff0c;再在PC机上进行数据处理。 PC机配置的都是RS-232标准串口&#xff0c;为D型…

浅谈Vue的属性,computed和watch

语法 是什么&#xff1f; 直接上demo&#xff0c;了解一下语法先~ <template><div><p>num1为{{ num1 }}</p><p>num2为{{ num2 }}</p><p>num1num2{{ result }}</p><button click"incrementNum1">num11</…

11.spring boot 启动源码(一)

目录 概述SpringApplication静态方法构造方法run 实例方法配置文件Actuator 工作原理*EndpointAutoConfigurationBeansEndpointAutoConfigurationShutdownEndpointAutoConfiguration结束概述 spring boot 版本 2.6.13 spring boot 启动源码(一) 涉及 SpringApplication 中静态…

YOLOv5改进 | 2023主干篇 | 多种轻量化卷积优化PP-HGNetV2改进主干(全网独家创新)

一、本文介绍 Hello,大家好,上一篇博客我们讲了利用HGNetV2去替换YOLOv5的主干,经过结构的研究我们可以发现在HGNetV2的网络中有大量的卷积存在,所以我们可以用一种更加轻量化的卷积去优化HGNetV2从而达到更加轻量化的效果(亲测优化后的HGNetV2网络比正常HGNetV2精度更高…

开发知识点-java基础

java基础知识整理 windows 多版本java jar包不能直接打开 需要java -jar问题解决 windows 多版本 控制面板 java15 download 多版本 https://www.cnblogs.com/chenmingjun/p/9941191.html https://gitee.com/shixinke/JC-jEnv/repository/archive/master.zip java jar包不…