【嵌入式高级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个数字 …...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
