Skip to content

读取和写入文件

李述铜

1183字约4分钟

2024-08-08

提示

同学,你好,欢迎学习本课程!本课程是介绍了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看来,这两者内容没有任何区别,都只是一些二进制数据。 具体数据内容的格式与含义,由上层应用解释。

文件读写指针

在打开的文件对象中,文件读/写指针用于指示下一次读/写操作要读取/写入的数据字节。刚打开文件时,指针指向文件数据的开头;随着读/写的字节数的增加,指针不断前移。