【嵌入式高级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个数字 …...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...