c++ 读文件 文件指针 继续读_FatFs文件系统使用笔记
关于FatFs文件系统的指引
关于FATFS的使用记录一、提前说明二、各文件说明三、使用说明 3.1 diskio.c函数的编写 3.2 f_open读写性质说明 3.3 ff的API函数四、关于SD卡协议与FatFs系统的单位解释
一、提前说明
FatFs 应用范围:
支持FAT12、FAT16 和FAT32; 可打开的文件:无限制,依赖于有效的存储器; 支持最多 10 个卷; 文件大小:与FAT 类型有关(upto 4G-1 bytes); 卷大小:与FAT 类型有关(upto 2T bytes on 512 bytes/sector); 簇大小:与FAT 类型有关(upto 64K bytes on 512 bytes/sector); 扇区大小:与FAT 类型有关(upto 4K bytes)。
FAT文件系统依次为:引导扇区、两个文件分配表、根目录区和数据区。
重要的结构体:
文件对象结构体(FIL类型):存放文件的相关信息,打开关闭读写文件等操作时需要使用其指针 ;
目录对象结构体(DIR类型):存放目录的相关信息,对目录操作时需要其指针 ;
文件状态结构体(FILINFO类型):存放文件的大小属性文件名等信息;
文件系统对象结构体(FATFS类型):文件系统对象的参数。
移植步骤:
数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数 据类型,并根据编译器定义好数据类型;
配置:打开 ffconf.h (我用的FatFs,不是Tiny,可以在此头文件中进行定义),文 件系统的配置裁剪等均在此头文件中进行定义配置;
函数编写:打开diskio.c,进行底层驱动编写,实际上需要编写6 个接口函数(见下方函数具体说明)。
二、各文件说明
文件名 | 功能 | 操作说明 |
---|---|---|
ffconf.h | FATFS模块配置文件 | 需要根据需求来配置参数。 |
ff.h | FATFS和应用模块公用的包含文件 | 不需要修改 |
ff.c | FATFS模块源码 | 不需要修改 |
diskio.h | FATFS和disk I/O模块公用的包含文件 | 不需要修改 |
diskio.c | FATFS和disk I/O模块接口层文件 | 与平台相关的代码,需要用户根据平台和存储介质来编写函数 |
interger.h | 数据类型定义 | 与编译器有关。 |
三、使用说明
3.1 diskio.c函数的编写
1、disk_initialize初始化磁盘驱动器
2、disk_status返回当前磁盘驱动器的状态
3、disk_read 从磁盘驱动器上读取扇区
4、disk_write 向磁盘写入一个或多个扇区
5、disk_ioctl 控制设备指定特性和除了读/写外的杂项功能
6、get_fattime 获取当前时间
3.2 f_open读写性质说明
f_open:创建/打开一个用于访问文件的文件对象
3.3 ff的API函数
FATFS给用户提供了大量的API函数:
函数名称 | 函数作用 |
---|---|
f_mount | 注册/注销一个工作区域(Work Area) |
f_open | 打开/创建一个文件 |
f_close | 关闭一个文件 |
f_read | 读文件 |
f_write | 写文件 |
f_lseek | 移动文件读/写指针 |
f_truncate | 截断文件 |
f_sync | 冲洗缓冲数据Flush Cached Data |
f_forward | 直接转移文件数据到一个数据流 |
f_stat | 获取文件状态 |
f_opendir | 打开一个目录 |
f_closdir | 关闭一个已经打开的目录 |
f_readdir | 读取目录条目 |
f_mkdir | 创建一个目录 |
f_unlink | 删除一个文件或目录 |
f_chmod | 改变属性(Attribute) |
f_utime | 改变时间戳(Timestamp) |
f_rename | 重命名/移动一个文件或文件夹 |
f_chdir | 改变当前目录 |
f_chdrive | 改变当前驱动器 |
f_getcwd | 获取当前工作目录 |
f_getfree | 获取空闲簇Get Free Clusters |
f_getlabel | 获取卷标签 |
f_setlabel | 设置卷标签 |
f_mks | 在驱动器上创建一个文件系统 |
f_fdisk | 分割物理卷 |
f_gets | 读一个字符串 |
f_putc | 写一个字符 |
f_puts | 写一个字符串 |
f_printf | 写一个格式化的字符串 |
f_tell | 获取当前读/写指针 |
f_eof | 测试文件结束 |
f_size | 获取文件大小 |
f_error | 测试文件上的错误 |
四、关于SD卡协议与FatFs系统的单位解释
如果使用SD卡,那么在SD2.0协议中明明说block为512字节(bytes)。
那为什么在FatFs中,sector size才是512字节呢?这不是错了吗?
其实文件系统的sector和block 与 SD协议的sector和block含义正好相反。
在SD协议中,大小包含关系是:block ⊆ sector;
而在FatFs中相反:sector ⊆ blockr。
由此可知,在disk_ioctl中GET_SECTOR_SIZE和GET_BLOCK_SIZE,可以有以下关系:
最大:8192 (4096kb / 512bytes)data blocks(SD) == 8192 sector(FatFs) == 1 block(FatFs)
最小:1 data blocks(SD) == 1 sector(FatFs) == 1 block(FatFs)
– | block | section |
---|---|---|
SD | a number of bytes, basic data transfer unit | a number of blocks, basic erase unit |
FATFS | A “block”, a contiguous number of bytes, is the minimum unit of memory that is read from and written to a disk by a disk driver | The sector is the minimum storage unit of a hard drive |
c++ 读文件 文件指针 继续读_FatFs文件系统使用笔记相关推荐
- mfc如何判断读到文件尾_C++ 判断读取文件尾
主要在于eof()不只是读取文件的最后一个字符,它会接着往后读取,如果此函数返回ture时,则此时返回的文件结束符0xFF才是真正的结尾. 具体内容如下: 在使用C/C++读文件的时候,一定都使用过e ...
- Python文件操作IO open 读-取-写
PythonIO文件操作,读.取.写 本篇内容 文件的操作. ▷文件的练习 ▷文件的操作 读取信息 .写入信息.文件有那么多的字,在什么地方写入.怎么 控制它. 文件对象 === 读取 === 写入 ...
- C语言文件操作 fopen, fclose, mkdir(打开关闭文件,建文件夹,判断文件是否存在可读或可写)
1.建文件夹 int _mkdir(const char *path,mode_t mode); 函数名: _mkdir 功 能: 建立一个目录 用 法: int _mkdir( const char ...
- python3生成文件对象(五分钟读懂)
生成文件对象 fileobject = open(filename,mode) # python2 python3 都可以用 fileobject = open(filename,mode) 常用的特 ...
- 三元运算符,文件处理的可读可写
1.三元运算符 1.1介绍 三元运算符又称三目运算,是对简单的条件语句的简写 语法:val =1 if 条件成立 else 2 简单条件语句: a = 0 if a == 0:val = 0 else ...
- python如何读pst文件_Python 学习 第11篇:文件读写
Python的文件是一个重要的对象,使用open()函数来打开文件,创建文件对象,进行文件的读写操作.当数据用于交换信息时,通常需要把数据保存为有格式的文本数据,可以保存为有特定的行分隔符和列分隔符的 ...
- 滴水三期逆向基础系列(一)-读取文件到内存再读取回文件
跟着滴水三期学了很长时间了,本着,每一点都要吃透的精神,跟"读文件到内存(拉伸),再读回文件(压缩回来)"杠了一天.先看看按着老师的架构写的代码吧(老师的代码有很多问题(可能是我太 ...
- python读写文件详解,将数据写入一个文件或读一个文件写入另一个文件中。
目录 实践一:读取文件并打印,read() 实践二:读取文件的一行并打印,readline() 实践三:读取文件的所有行存入到一个列表中并打印,readlines() 实践四:向文件中写入字符串,wr ...
- C++ 学习(15)文件操作、文件文件读与写操作、二进制文件读与写操作
程序运行时产生的数据者属于临时数据,程序一旦运行结束临时数据都会被释放.通过文件可以将数据持久化. C++ 文件操作 C++中对文件操作需要包含头文件<fstream> 文件类型分为两种: ...
最新文章
- 机器学习算法学习---模型融合和提升的算法(五)
- 报道称:Check Point正在洽谈收购CyberArk
- JavaScript——定时器(setTimeout/setInterval)
- ABP v1.0正式发布
- linux字符设备驱动之字符之异步通知
- tensorflow 学习资料汇总
- markdown编辑器 使用语法
- Mysql replace 与 insert on duplicate效率分析
- the road to TCPIP(1)--TCPIP详解--数据链路层
- 中国互联网变天,小米上市后将彻底冲破 BAT 格局
- ORACLE有EXCEL中trend函数,【Excel函数】TREND函数 - 曹海峰个人博客
- 驱动精灵w8ndows xp sp2,爱普生Epson TM-L60II打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
- F28335的SCI模块
- VDA6.3认证辅导,VDA6.3认证以保证汽车零部件生产过程中的质量保证
- 用Navicat连接阿里云数据库RDS
- 支付宝|微信|h5|个人收款免签约支付系统源码
- Cocos Creator转盘抽奖
- 玫瑰线 matlab,如何用MATLAB画玫瑰线
- SVG黑科技微信排版『层层左右交错滑开』模板代码
- 整理了一波年终总结模版,速领!
热门文章
- python 内置函数的一部分
- I.MX6 Goodix GT9xx touchscreen driver porting
- Programming in Scala (Second Edition) 读书笔记12 Trais
- C#中的MessageBox消息对话框
- JDBC连接数据库总结
- Google的系统工程师(SA)如何工作
- 用标号跳出当前多重嵌套循环是否继续执行循环_4、在JAVA中如何跳出当前的多重嵌套循环?-Java面试题答案...
- 计算机的主要硬件部件,主要内容: 计算机的基本概念 系统硬件组成(主要部件、系...的.ppt 文档全文预览...
- spark编程mysql数据源_Spark - 直接操作数据源 MySQL
- mysql sqlserver对比_很用心的写了 9 道 MySQL 面试题