Skip to content

文件读写定位

李述铜

755字约3分钟

2024-08-08

提示

同学,你好,欢迎学习本课程!本课程是介绍了FATFS文件系统模块的基本使用,是一门相对较简单的课程。

如果你对文件系统的实现比较感兴趣,也可以关注我的《从0到1写FAT32文件系统》课程。

欢迎转载本文章,转载请注明链接来源,谢谢!

本小节介绍FATFS的读写定位接口,可参考C标准库中的fseek和rewind:

应用场合

在对文件读写时,并不总是从文件的最开始进行。在有些情况下,我们可能需要从文件的中间某个位置开始读写,因此,需要能够控制当前文件读写位置的函数。

接口介绍

f_lseek()函数

f_lseek函数可用于移动文件的读/写指针,也可以用于扩展文件大小(预分配簇)。

FRESULT f_lseek (
  FIL*    fp,  /* [IN] File object */
  FSIZE_t ofs  /* [IN] Offset of file read/write pointer to be set */
);

参数:

  • fp:指向已打开文件对象的指针。
  • ofs:设置要移动的文件读/写指针的字节偏移量,该偏移相对文件开头进行计算

返回值:

  • FR_OK:操作成功。
  • FR_DISK_ERR:磁盘错误。
  • FR_INT_ERR:内部错误。
  • FR_INVALID_OBJECT:无效的对象。
  • FR_TIMEOUT:操作超时。

描述

f_lseek函数可移动文件的读/写指针,而不进行实际的读/写操作。所以,其相比通过读取来调整文件指针位置要快很多。

f_rewind()函数

另一用于辅助实现指针定位的函数是f_rewind(),它的功能是将读写指针重置到文件的最开始位置。

FRESULT f_rewind (
  FIL*    fp   /* [IN] File object */
);

示例

以下是上述接口使用的示例:

// 将读/写指针设置为5000
res = f_lseek(fp, 5000);

// 将读/写指针设置到文件末尾以附加数据
res = f_lseek(fp, f_size(fp));

// 向前移动读/写指针3000字节
res = f_lseek(fp, f_tell(fp) + 3000);

// 向后移动读/写指针2000字节(注意处理溢出)
res = f_lseek(fp, f_tell(fp) - 2000);

// 调整到文件开头
res = f_rewind(fp)

注意事项

定位到文件尾部

如果希望打开文件时,直接定位到文件尾部进行修改,可以修改f_open()中mode的参数,使用FA_OPEN_APPEND。当然也可以使用f_lseek()手动定位来完成。

超出文件大小

在写模式下,有可能出现超出文件大小的偏移量,即文件大小只有100字节,但是f_lseek()控制指针的位置要移动到200字节。显然,此时就超出了已有文件的大小。此时,指针位置的移动仍然能进行,在f_lseek()内部会主动扩充文件的大小,增加到200字节。至于扩充的数据是什么,则是未定义的。

alt 超出文件大小的问题