外观
读取和写入文件
提示
同学,你好,欢迎学习本课程!本课程是介绍了FATFS文件系统模块的基本使用,是一门相对较简单的课程。
如果你对文件系统的实现比较感兴趣,也可以关注我的《从0到1写FAT32文件系统》课程。
欢迎转载本文章,转载请注明链接来源,谢谢!
在文件打开之后,就可以对文件进行读写。文件读写主要使用f_read()、f_write()接口。
可以将这些接口与C标准库的fread()/fwrite()接口进行对比:
读取文件
要实现文件读取操作,可使用f_read()函数,该函数用于从文件中读取数据。其函数原型如下:
FRESULT f_read(
FIL* fp, /* [IN] 文件对象指针 */
void* buff, /* [OUT] 存储读取数据的缓冲区指针 */
UINT btr, /* [IN] 要读取的字节数 */
UINT* br /* [OUT] 读取的字节数将存储在这个变量中 */
);
参数说明:
fp
:指向打开文件对象的指针。buff
:指向存储读取数据的缓冲区的指针。btr
:要读取的字节数,以UINT类型表示。如果需要快速读取文件,建议一次尽可能多地读取字节。br
:指向存储读取字节数的UINT变量的指针。无论函数的返回代码如何,此值在函数调用后始终有效。如果返回值等于btr
,则函数的返回代码应为FR_OK
。
返回值:
f_read
函数的返回值可能是以下之一:FR_OK
, FR_DISK_ERR
, FR_INT_ERR
, FR_DENIED
, FR_INVALID_OBJECT
, FR_TIMEOUT
。
功能描述: 在刚刚打开文件时,默认从文件开头进行数据的读取,每次读取一定的数据之后,其文件内部的读写指针也会随时前移。通过反复调用f_read()函数,最终可以将整个文件的内容全部读取出来。
注意:f_read()函数的返回值并不提供有关是否读到文件末尾的功能。需要通过检查*br < btr是否成立来判断是否已经读取文件所有内容。
写入文件
要实现文件写操作,可使用f_write()函数,该函数用于从文件中写入数据。其函数原型如下:
FRESULT f_write(
FIL* fp, /* [IN] 指向文件对象结构的指针 */
const void* buff, /* [IN] 指向要写入的数据的指针 */
UINT btw, /* [IN] 要写入的字节数 */
UINT* bw /* [OUT] 用于返回已写入字节数的变量的指针 */
);
参数说明:
fp
:指向打开文件对象结构的指针。buff
:指向要写入的数据的指针。btw
:要写入的字节数,以UINT类型表示bw
:指向存储已写入字节数的UINT变量的指针。
返回值:
f_write
函数的返回值可能是以下之一:FR_OK
, FR_DISK_ERR
, FR_INT_ERR
, FR_DENIED
, FR_INVALID_OBJECT
, FR_TIMEOUT
。
功能描述: f_write
函数从文件的读/写指针所指向的位置开始写入数据。随着写入的字节数增加,读/写指针也会随之前进。在函数成功执行后,应检查*bw
的值,以确定磁盘是否已满。如果*bw
小于btw
,则意味着在写入操作期间,磁盘已经满了。在磁盘满或接近满时,函数可能需要一些时间来完成写操作。
由此可以看到,f_read()在读取文件时,当读到文件尾部时就无法再继续往下读取;而f_write()在写入文件时,当到达文件尾部时,则会对文件大小增加,以便继续写入。
注意事项
文件读写的数据格式
有同学曾经问我,FATFS写入的文件数据格式倒底是什么?
实际上,FATFS在进行文件写入时,并不关心具体的内容是什么,即并不了解文件的格式。它只是将传入到f_write()中缓存区的数据以原始二进制的方式写入到文件中。
也就是说,你可以将WORD文档写入文件,也可以将PDF文档写入文件。在FATFS看来,这两者内容没有任何区别,都只是一些二进制数据。 具体数据内容的格式与含义,由上层应用解释。
文件读写指针
在打开的文件对象中,文件读/写指针用于指示下一次读/写操作要读取/写入的数据字节。刚打开文件时,指针指向文件数据的开头;随着读/写的字节数的增加,指针不断前移。