嵌入式Linux系统编程 — 2.2 标准I/O库:检查或复位状态
目录
1 检查或复位状态简介
2 feof()函数
2.1 feof()函数简介
2.2 示例程序
3 ferror()函数
4 clearerr()函数
4.1 clearerr()函数简介
4.2 示例程序
1 检查或复位状态简介
调用 fread() 函数读取数据时,如果返回值小于参数 nmemb 所指定的值,这通常意味着发生了两种情况之一:要么是读取过程中遇到了文件末尾(end-of-file,EOF),要么是发生了某种错误。然而,fread() 函数本身并不提供足够的信息来区分这两种情况。有几种方法确定具体的原因:
- 一种方法是检查错误标志,这可以通过调用
ferror()函数实现,它会返回一个非零值如果文件流遇到了错误。 - 另一种方法是检查文件结束标志,这可以通过调用
feof()函数来完成,它会在到达文件末尾时返回一个非零值。
通过结合使用 ferror() 和 feof() 函数,可以更准确地判断 fread() 返回较小值的具体原因,从而采取相应的处理措施。
2 feof()函数
2.1 feof()函数简介
feof() 函数是 C 语言标准库中的一个函数,用于检查文件流是否已到达文件末尾(end-of-file,EOF)。当从文件中读取数据时,如果已经读取到文件的最后,feof() 函数可以用来确定是否还有更多的数据可以读取。函数原型如下:
int feof(FILE *stream);
- 参数:
stream是指向FILE结构的指针,该结构代表了要检查的文件流。 - 函数返回值:如果文件流已经到达文件末尾,返回非零值(通常是 1),如果文件流还没有到达文件末尾,返回 0。
2.2 示例程序
下面的代码实现了检测文件的读写位置是否移动到了文件末尾,并逐个字符打印。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{FILE *readFile, *writeFile;char buffer[256];const char *filename = "example.txt"; // 临时文件名// 打开文件以写入writeFile = fopen(filename, "w"); // 以文本写入模式打开文件if (writeFile == NULL) {perror("Error opening file for writing");return EXIT_FAILURE;}// 提示用户输入文本printf("Enter your text (max 1024 characters): ");fgets(buffer, sizeof(buffer), stdin); // 从标准输入读取一行文本// 写入文本到文件fputs(buffer, writeFile);// 关闭写入文件fclose(writeFile);// 打开同一个文件以读取readFile = fopen(filename, "r"); // 以文本读取模式打开文件if (readFile == NULL) {perror("Error opening file for reading");return EXIT_FAILURE;}// 循环读取文件,直到到达文件末尾while (!feof(readFile)) {int ch = fgetc(readFile); // 逐个字符读取if (ch != EOF) {printf("%c\n", ch); // 打印读取的字符} else {break; // 如果到达文件末尾或读取失败,退出循环}}// 检查是否有错误发生if (ferror(readFile) != 0) {perror("Error reading file");}// 关闭读取文件fclose(readFile);return EXIT_SUCCESS;
}
首先以文本写入模式打开(或创建)一个名为 "example.txt" 的文件,并将用户输入的文本存储到该文件中。接着,程序使用 feof() 函数检测是否到达文件末尾,并使用 fgetc() 函数逐个字符地读取文件内容,每个字符后跟一个换行符打印到标准输出。最后通过ferror() 函数来检查错误状态并关闭读取的文件。程序运行的结果如下:

3 ferror()函数
上面的示例程序中提到了库函数 ferror(),ferror()函数用于测试参数 stream 所指文件的错误标志,如果错误标志被设置了,则调用 ferror()函数将返回一个非零值,如果错误标志没有被设置,则返回 0。其函数原型如下所示:
#include <stdio.h>int ferror(FILE *stream);
4 clearerr()函数
4.1 clearerr()函数简介
库函数 clearerr()用于清除 end-of-file 标志和错误标志,当调用 feof()或 ferror()校验这些标志后,通常需要清除这些标志,避免下次校验时使用到的是上一次设置的值,此时可以手动调用 clearerr()函数清除标志。函数原型如下:
void clearerr(FILE *stream);
使用场景:当你检测到文件流有错误(通过 ferror(stream))或到达文件末尾(通过 feof(stream))后,如果还想继续从该流中读取或写入数据,你可以使用 clearerr() 来清除这些标志。这通常在你解决或忽略了错误,并希望继续处理文件时使用。
4.2 示例程序
下面的代码实现了利用clearerr()函数清除文件流 fileStream 的 EOF 标志和错误标志。
#include <stdio.h>
#include <stdlib.h>int main(void)
{FILE *fileStream = NULL; // 更具描述性的变量名const char *filename = "example.txt"; // 临时文件名char buffer[20] = {0}; // 使用 buffer 替代 buf,更清晰地表达用途/* 打开文件 */if (NULL == (fileStream = fopen(filename, "w"))) {perror("Error opening file");exit(EXIT_FAILURE); // 使用 EXIT_FAILURE 宏替代 -1}printf("File opened successfully!\n");/* 移动读写位置到文件末尾 */if (0 > fseek(fileStream, 0, SEEK_END)) {perror("Error seeking to end of file");fclose(fileStream);exit(EXIT_FAILURE);}/* 读取文件 */if (fread(buffer, 1, 10, fileStream) < 10) { // 检查是否成功读取 10 个字符if (feof(fileStream)) {printf("End-of-file flag is set, reached the end of file!\n");} else {perror("Error reading file");}clearerr(fileStream); // 清除 EOF 或错误标志}/* 关闭文件 */fclose(fileStream);exit(EXIT_SUCCESS); // 使用 EXIT_SUCCESS 宏替代 0
}
首先尝试以写入模式打开一个文件,然后将文件指针移动到文件末尾。接着读取文件,如果读取的字节少于预期,它将检查是否到达文件末尾或发生错误。clearerr(fileStream); 这行代码用于清除文件流 fileStream 的 EOF 标志和错误标志,使得后续操作可以继续在文件流上进行,而不受之前错误或 EOF 状态的影响。最后,代码关闭文件并正常退出。运行的结果如下:

相关文章:
嵌入式Linux系统编程 — 2.2 标准I/O库:检查或复位状态
目录 1 检查或复位状态简介 2 feof()函数 2.1 feof()函数简介 2.2 示例程序 3 ferror()函数 4 clearerr()函数 4.1 clearerr()函数简介 4.2 示例程序 1 检查或复位状态简介 调用 fread() 函数读取数据时,如果返回值小于参数 nmemb 所指定的值,这…...
pESC-HIS是什么,怎么看?-实验操作系列-2
01 典型的pESC-HIS质粒遗传图谱 02 介绍 质粒类型:酿酒酵母蛋白表达载体 表达水平:高拷贝 诱导方法:半乳糖 启动子:GAL1和GAL10 克隆方法:多克隆位点,限制性内切酶 载体大小:6706bp 5 测…...
树形表/树形数据接口的开发
数据表格式 需要返回的json格式 点击查看json数据 [{"childrenTreeNodes" : [{"childrenTreeNodes" : null,"id" : "1-1-1","isLeaf" : null,"isShow" : null,"label" : "HTML/CSS","na…...
二叉树的镜像--c++【做题记录】
【问题描述】 给定扩展二叉树的前序序列,构建二叉树。 求这课二叉树的镜像,并输出其前序遍历序列。 【输入形式】 输入扩展二叉树的前序序列。 【输出形式】 输出镜像二叉树的前序遍历序列。 【样例输入】 ab##cd##e## 【样例输出】 镜像后二叉树的前序遍…...
redis安裝启动
1、下载redis解压 https://github.com/tporadowski/redis/releases 2、打开cmd,切换到解压的文件夹 3、redis-server.exe redis.windows.conf 启动redis redis可通过命令行输入config set requirepass password和直接修改redis.config文件中修改 requirepass 来设…...
为什么Java中的main方法必须是public static void的?
当我们创建main方法时,首先都是public、都是static,返回值都是void,方法名都是main,入参都是一个字符串数组。 在以上的方法声明中,唯一可以改变的部分就是方法的参数名,我们可以吧args改成任意我们想要使…...
shell的编程方式
文章目录 变量俩种方式第一种方式第二种方式 取消变量数组创建数组获取数组元素的方式 read输出的方式限制输入的方式 流程控制方式for循环输出的方式第一种方式第二种方式while循环输出的方式select选择输出的方式 判断方式判断的四种方式第一种方式第二种方式第三种方式 算术…...
前端面试项目细节重难点(已工作|做分享)想(八)
面试官:请你讲讲你在该项目中遇到的印象深刻的问题是什么? 答:我的回答:该项目的实现过程中我确实遇到了问题:【我会给大家整理回答思路和角度,那那么遇到这样的问题也可借鉴这种思路进行阐述】 第一层面…...
Loguru,一个 Python 日志神器
大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。 一个简单的库,也许能够开启我们的智慧之门, 一个普通的方法,也许能在危急时刻挽救我们于水深火热, 一个新颖的思维方式,也许能激发我们无尽的创造力, 一个独特的技巧,也许能成为我们的隐形盾牌…… 神奇的 Pyth…...
C++ 反转单词
在C中,反转一个字符串中的单词(单词之间通过空格分隔,但单词内部保持原有顺序)可以通过以下步骤实现: 找到字符串中的所有单词,这可以通过查找空格来实现。将单词存储在一个容器中(例如 std::v…...
Apache Doris 基础 -- 数据表设计(表索引)
1、索引概述 索引用于帮助快速过滤或搜索数据。目前,Doris支持两种类型的索引:内置智能索引和用户创建的二级索引。 内置智能索引 排序键和前缀索引:Apache Doris基于排序键以有序的方式存储数据。它为每1024行数据创建一个前缀索引。索引中的键是当前1024行组的…...
资源描述框架的用途及实际应用解析
什么是RDF? RDF代表 资源描述框架 RDF是用于描述网络资源的框架 RDF旨在被计算机阅读和理解 RDF并非设计用于供人阅读 RDF以 XML 编写 示例 描述购物商品的属性,如价格和可用性描述网络活动的时间表描述网页的信息(内容,作者&a…...
工业级物联网边缘网关解决方案-天拓四方
随着工业4.0时代的到来,越来越多的企业开始寻求智能化升级,以提高生产效率、降低运营成本并增强市场竞争力。然而,在实际的转型升级过程中,许多企业面临着数据孤岛、设备兼容性差、网络安全风险高等问题,这些问题严重制…...
认识微服务,认识Spring Cloud
1. 介绍 本博客探讨的内容如下所示 什么是微服务?什么是springcloud?微服务和springcloud有什么关系? 首先,没有在接触springcloud之前,我写的项目都是单体结构, 但随着网站的用户量越来越大,…...
电脑设置密码怎么设置?让你的电脑更安全!
在如今信息化的社会中,保护个人电脑的安全至关重要。设置密码是最基本的电脑安全措施之一,它可以有效防止未经授权的访问和保护个人隐私,可是电脑设置密码怎么设置?本文将介绍三种设置电脑密码的方法,帮助您加强电脑的…...
搜维尔科技:SenseGlove Nova2使用主动接触反馈来模拟手掌的感觉,结合力反馈和振动触觉反馈,使其成为市场上第一款具有手掌反馈的无线触觉手套
SenseGlove Nova2使用主动接触反馈来模拟手掌的感觉,结合力反馈和振动触觉反馈,使其成为市场上第一款具有手掌反馈的无线触觉手套。 搜维尔科技:SenseGlove Nova2使用主动接触反馈来模拟手掌的感觉,结合力反馈和振动触觉反馈&…...
基于Python的实验室管理系统的设计与实现(论文+源码)_kaic
摘 要 随着实验室设备越来越多,实验室及其设备管理工作变得越来越繁重,还存在些管理模式仍旧处于手工管理模式和一些抢占实验室的不文明现象,传统的手工模式已经满足不了日益增长的管理需求,而本系统摒弃传统模式,开启…...
Windows系统WDS+MDT网络启动自动化安装
Windows系统WDS+MDT网络启动自动化安装 适用于在Windows系统上WDS+MDT网络启动自动化安装 1. 安装准备 1.下载windows server 2019、windows 10 pro的ISO文件,并安装好windows server 2019 2.下载windows 10 2004版ADK及镜像包 1.1 安装平台 Windows 111.2. 软件信息 软件…...
Apple开发者证书创建完整过程
1.创建CSR文件: 打开钥匙串访问程序 选择从证书颁发机构请求 创建证书 保存CSR文件到桌面 成功如下: 开始创建证书: 选择...
for深入学习
目录 练习: 例1: 求解0-100中整除3的数有哪些 例2: 求0-100中含数字9个个数 作业: 练习: 例1: 求解0-100中整除3的数有哪些 代码: #include<stdio.h> int main() {printf("整…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
