【嵌入式高级C语言】10:C语言文件
文章目录
- 1 文件的概述
- 1.1 文件分类(存储介质)
- 1.2 磁盘文件分类(存储方式)
- 1.3 二进制文件和文本文件的区别
- 2 文件缓冲区
- 3 文件指针
- 4 文件的API
- 4.1 打开文件
- 4.2 关闭文件
- 4.3 重新定位流
- 4.3.1 fseek
- 4.3.2 ftell
- 4.3.3 rewind
- 4.4 字符输出到文件
- 4.5 字符串输出到文件
- 4.6 字符的输入
- 4.7 字符串的输入
- 4.8 二进制流输出
- 4.9 二进制流输入
- 5 示例
1 文件的概述
1.1 文件分类(存储介质)

1.2 磁盘文件分类(存储方式)
- 从物理的角度看
任何磁盘文件在物理上都是二进制存储的。
- 从逻辑的角度看

1.3 二进制文件和文本文件的区别


2 文件缓冲区

文件缓冲区的作用:提高访问效率,提高磁盘使用寿命。
Linux下缓冲区的4种刷新方式:
- 行刷新(遇到换行符刷新)。
- 满刷新(缓冲区数据放满刷新)。
- 强制刷新(使用
fflush函数将缓冲区刷新)。 - 关闭刷新(关闭文件时将缓冲区数据全部刷新)。
fflush()详解
fflush - 刷新流
对于输出流,fflush()通过流的底层写入函数,强制写入所有的用户空间缓存数据到给定的输出或者更新流。
如果流的参数为NULL,fflush()会刷新所有打开的输出流。概要#include <stdio.h>int fflush(FILE *stream);参数stream - 流返回值成功完成后返回 0。否则,返回 EOF 并返回 errno设置以指示错误。
示例:制作模拟时钟
#include <stdio.h>
#include <unistd.h>int main(int argc, char **argv)
{int min = 0;int sec = 0;while (1){// 输出时钟printf("\r%02d:%02d", min, sec);// 刷新缓冲区fflush(stdout);// 睡眠1秒sleep(1);// 时钟逻辑判断sec++;if (60 == sec){sec = 0;min++;if (60 == min){min = 0;} /* end of if (60 == min) */} /* end of if (60 == sec) */} /* end of while (1) */return 0;
}

3 文件指针
所有操作文件的库函数都需要借助文件指针操作文件。
- 定义文件指针的一般形式为
FILE *指针变量标识符,FILE为大写,需包含<stdio.h>。 FILE是系统使用typedef定义出来的有关文件信息的一种结构体变量,含有文件名、文件状态和文件当前位置等信息。- 一般情况下,我们操作文件前必须定义一个文件指针来标示我们将要操作的文件。
- 在实际编程中,我们无需关心
FILE结构体的细节,只需要将文件指针传给io库函数,库函数再通过结构体里的信息对文件进行操作。
对文件操作的步骤:
- 对文件进行读写等操作之前要打开文件得到文件指针。
- 可以通过文件指针对文件进行读写操作。
- 读写等操作完毕后,需要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了。
补充:在C语言中有三个特殊的文件指针无需定义,在程序中可以直接使用(每个进程)
stdin:标准输入。–> 默认为当前终端(键盘)stdout:标准输出。–> 默认为当前终端(屏幕)stderr:标准错误输出设备。–> 默认为当前终端(屏幕)
4 文件的API
4.1 打开文件
fopen - 流打开函数
fopen() 函数打开名称为路径名指向的字符串的文件并将流与其关联。概要#include <stdio.h>FILE *fopen(const char *pathname, const char *mode);参数pathname - 文件路径名mode - 文件打开模式r 打开文本文件进行读取。该流位于文件开头。r+ 打开以进行读取和写入。该流位于文件开头。w 将文件截断为零长度或创建用于写入的文本文件。流是位于文件的开头。w+ 打开以进行读取和写入。如果文件不存在则创建,否则它会被截断。该流位于该流的文件开头。a 打开以追加(写入文件末尾)。如果不存在则创建该文件。该流位于文件末尾。a+ 打开以进行读取和追加(写入文件末尾)。该文件不存在则创建。输出总是附加到末尾文件。返回值成功完成后,fopen()、fdopen() 和 freopen() 返回一个 FILE 指针。否则,返回 NULL 并设置 errno 来指示错误。

4.2 关闭文件
fclose - 关闭流
fclose() 函数刷新流指向的流(写入任何缓冲的使用 fflush(3)) 输出数据并关闭底层文件描述符。概要#include <stdio.h>int fclose(FILE *stream);参数stream - 文件流返回值成功完成后,返回 0。否则,返回 EOF 并返回 errno设置以指示错误。
4.3 重新定位流
4.3.1 fseek
fseek - 重新定位流
fseek() 函数设置流指向的流的文件位置指示符。新位置(以字节为单位)是通过将偏移字节添加到由whence指定的位置。
如果whence设置为SEEK_SET、SEEK_CUR或SEEK_END,偏移量相对于文件的开头,指示符当前位置或文件结尾。概要#include <stdio.h>int fseek(FILE *stream, long offset, int whence);参数stream - 文件流offset - 偏移量whence - 流指针位置SEEK_SET - 文件的开头SEEK_CUR - 指示符当前位置SEEK_END - 文件结尾返回值成功完成后,返回0。否则,-1返回并设置 errno 以指示错误。
4.3.2 ftell
ftell - 重新定位流
ftell() 函数获取stream 指向的流的文件位置指示符的当前值。概要#include <stdio.h>long ftell(FILE *stream);参数stream - 文件流返回值成功完成后ftell() 返回当前偏移量。否则,-1返回并设置 errno 以指示错误。
4.3.3 rewind
rewind - 重新定位流
rewind() 函数设置指向的流的文件位置指示器流到文件的开头。
相当于 fseek(stream, 0L, SEEK_SET);概要#include <stdio.h>void rewind(FILE *stream);参数stream - 文件流返回值rewind() 函数不返回任何值。
4.4 字符输出到文件
fputc - 字符输出到文件
fputc() 将字符 c 写入流,转换为无符号字符。概要#include <stdio.h>int fputc(int c, FILE *stream);参数c - 字符stream - 文件流返回值返回以 unsigned char 形式写入的字符;出错时转换为 int 或 EOF。
4.5 字符串输出到文件
fputs - 字符串输出到文件
fputs() 将字符串 s 写入流,不带终止空字节 ('\0')。概要#include <stdio.h>int fputs(const char *s, FILE *stream);参数s - 字符串首地址stream - 文件流返回值成功时返回一个非负数,在错误时返回 EOF。
4.6 字符的输入
fgetc - 字符的输入
fgetc() 从流中读取下一个字符并将其作为无符号字符返回;
在文件末尾或发生错误时转换为 int 或 EOF。概要#include <stdio.h>int fgetc(FILE *stream);参数stream - 文件流返回值返回作为 unsigned char 转换读取的字符;文件末尾或错误时为 int 或 EOF。
4.7 字符串的输入
fgets - 字符串的输入
fgets() 从流中最多读取一个小于 size 的字符并将它们存储到s指向的缓冲区中。
读取在 EOF 或换行符后停止。如果读取换行符,则将其存储到缓冲区中。一个术语空字节('\0')存储在缓冲区中最后一个字符之后。概要#include <stdio.h>char *fgets(char *s, int size, FILE *stream);参数s - 缓冲区地址size - 缓冲区总大小stream - 流返回值fgets() 成功时返回 s,出错时或在未读取字符的情况下发生文件末尾时返回 NULL。注意不建议将对 stdio 库的输入函数的调用与对 read(2) 的低级调用混合使用与输入流关联的文件描述符;结果将是不确定的,很可能不是你要。
4.8 二进制流输出
fwrite - 二进制流输出
函数 fwrite() 将 nmemb 数据项(每个大小size)写入Stream 指向的流,从 ptr 给出的位置获取它们。概要#include <stdio.h>size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);参数ptr - 写入数据的地址size - 块大小nmemb - 块数stream - 文件流返回值成功后,fwrite() 返回写入的项目数。这仅当 size 为 1 时,number 才等于传输的字节数。
4.9 二进制流输入
fread - 二进制流输入
函数 fread() 从以下位置读取 nmemb 数据项,每个大小为 size 长 Stream 指向的流,将它们存储在 ptr 指定的位置。概要#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);参数ptr - 存储数据的地址size - 块大小nmemb - 块数stream - 文件流返回值成功后,fread() 返回读取的项目数。这仅当 size 为 1 时,number 才等于传输的字节数。注意fread() 不区分文件结束和错误,调用者必须使用feof(3) 和ferror(3) 来确定发生了哪一个。
5 示例
#include <stdio.h>int main(int argc, char **argv)
{FILE *fp = NULL;char str[128] = "hello world!";long ret = 0L;/* 打开文件 */fp = fopen("test", "w+");if (NULL == fp){perror("fopen");return -1;} /* end of if (NULL == fp) *//* 写入 */ret = fwrite(str, sizeof(char), sizeof(str), fp);printf("%ld\n", ret);/* 关闭文件 */fclose(fp);fp = NULL;return 0;
}
$ ./a.out
128

相关文章:
【嵌入式高级C语言】10:C语言文件
文章目录 1 文件的概述1.1 文件分类(存储介质)1.2 磁盘文件分类(存储方式)1.3 二进制文件和文本文件的区别 2 文件缓冲区3 文件指针4 文件的API4.1 打开文件4.2 关闭文件4.3 重新定位流4.3.1 fseek4.3.2 ftell4.3.3 rewind 4.4 字…...
创建数据表
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 如果要进行数据表的创建 create table 表名称 (列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,...列名称 类型 [DEFAULT 默认值 ] )…...
C语言字符串型常量
在C语言中,字符串型常量是由一系列字符组成的常量。字符串常量在C中以双引号(")括起来,例如:“Hello, World!”。字符串常量在C中是不可变的,也就是说,一旦定义,就不能修改其内…...
计算机网络 八股
计算机网络体系结构 OSI:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层...
深入了解 Jetpack Compose 中的 Modifier
Jetpack Compose 是 Android 中用于构建用户界面的现代化工具包。其中,Modifier 是一个非常重要的概念,它允许我们对 UI 组件进行各种样式和布局的调整。在本篇博客中,我们将深入了解 Modifier,以及如何在 Compose 中使用它。 什…...
【数据库】聚合函数|group by分组|having|where|排序|函数 关键字的使用
目录 一、聚合函数 1、max() 2、min() 3、avg() 4、sum() 5、count() 二、group by 分组汇总 一般聚合函数配合着group by(分组)语句进行使用 把一组的数据放到一起,再配合聚合函数进行使用 三、having having语句 做筛选的 四、where和having的作用以及区…...
docker安装mongoDB及使用
一.mongodb是什么? MongoDB是一个NoSQL的非关系型数据库 ,支持海量数据存储,高性能的读写 1.mongo的体系结构 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档colum…...
Linux 之五:权限管理(文件权限和用户管理)
1. 文件权限 在Linux系统中,文件权限是一个非常基础且重要的安全机制。它决定了用户和用户组对文件或目录的访问控制级别。 每个文件或目录都有一个包含9个字符的权限模式,这些字符分为三组,每组三个字符,分别对应文件所有者的权限…...
基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
MySQL 在聚合函数查询的结构中继续过滤
HAVING HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法,如果想要从 GROUP BY 分组中进行筛选的话,不是用 WHERE 而是使用 HAVING 来进行聚合函数的筛选。 语法 SELECT <列名1>, <列名2>,…...
UE4.27_ParticleSystem(没写完的材料)
UE4.27_ParticleSystem(没写完的材料) 参考实例: UE4[蓝图]下雪效果及雪的材质的实现...
腾讯云轻量服务器流量用完了怎么办?停机吗?
腾讯云轻量服务器流量用完了怎么办?超额流量另外支付流量费,流量价格为0.8元/GB,会自动扣你的腾讯云余额,如果你的腾讯云账号余额不足,那么你的轻量应用服务器会面临停机,停机后外网无法访问,继…...
块级作用域、变量提升
1.块级作用域 JS 中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称 ES6)中新增了块级作用域。块作用域由 { } 包括,if 语句和 for 语句里面的{ }也属于块作用域。 2.变量提升 如果变量声明在函数里面,则将变量声…...
c# 连接oracle 及对应获取数据集
1、数据库配置xml,首先连接成功后会自动创建xml并保存到对应xml,如下 static string ConnPath AppDomain.CurrentDomain.BaseDirectory "ConnOrcle.xml"; 声明xml名称,便于后续写入对应数据库参数 2、创建xml /// <summar…...
JS直接量及其相关对象
什么是直接量 直接量是指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型:表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后,ES就会自动判断其类型,而且当参数发生变…...
一 windso10 笔记本刷linux cent os7.9系统
1:准备材料 16G以上U盘, 笔记本一台 镜像选了阿里云镜像:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 软件:链接:https://pan.baidu.com/s/13WDp2bBU1Pdx4gRDfmBetg 提取码:09s3 2:把镜像写入U盘,本人已经写入好了,选择镜像,点开始就是,确定等…...
118.龙芯2k1000-pmon(17)-制作ramdisk
目前手上这个设备装系统不容易,总是需要借助虚拟机才能实现。 对生产就不太那么友好,能否不用虚拟机就能装Linux系统呢? 主要是文件系统的问题需要解决,平时我们一般是用nfs挂载后,然后对硬盘格式化,之后…...
IP-guard邮件管控再升级,记录屏幕画面,智能阻断泄密邮件
邮件是工作沟通以及文件传输的重要工具,却也成为了信息泄露的常见渠道。员工通过邮件对外发送了什么内容,是否含有敏感信息都无从得知,机密通过邮件渠道外泄也难以制止。想要防止企业的重要信息通过邮件方式泄露,我们不仅需要通过技术措施对外发邮件的行为进行规范,也要对…...
#LLM入门|Prompt#2.10_评估、自动化测试效果(下)——当不存在一个简单的正确答案时 Evaluation Part2
上一章我们探索了如何评估 LLM 模型在 有明确正确答案 的情况下的性能,并且我们学会了编写一个函数来验证 LLM 是否正确地进行了分类列出产品。 在使用LLM生成文本的场景下,评估其回答准确率可以是一个挑战。由于LLM是基于大规模的训练数据进行训练的&am…...
round四舍五入在python2与python3版本间区别
round()方法返回数值的小数点四舍五入到n个数字。 语法 以下是round()方法的语法: round( x ,n) 参数 x --这是一个数值,表示需要格式化的数值 n --这也是一个数值,表示小数点后保留多少位 返回值 该方法返回 数值x 的小数点四舍五入到n个数字 …...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
