Fat File System是指一种文件系统,全名为File Allocation Table,即文件分配表。它是由Microsoft的Windows执行系统使用的一种文件系统,可被应用于硬盘、软盘、U盘等可存储设备中。FAT兼容性良好,在绝大多数操作系统上都能够使用。在嵌入式系统中,fatfs也是一种常用的文件系统。
在fatfs文件系统中,如果需要将数据写入一个文件中,通常需要按照如下流程操作:打开文件、定位文件指针、写入数据、关闭文件。如果需要连续写入数据,就需要在每次写入完成后,重新定位文件指针,使得下一次写入数据时,不会覆盖上一次写入的数据,并且数据能够按照给定的顺序连续写入。也就是说,每次定位文件指针都是为了避免数据的覆盖。
当我们需要连续写入数据时,通常会选择先Seek到文件末尾,以此来定位到下一次写入数据的起始位置。但是,如果上一次写入数据不是以扇区为单位的话,下一次写入数据就会从上一次写入的那个扇区的末尾开始。这种情况下,如果上次最后几个字节是在扇区的末尾处,下次写入会发现文件指针到了下一个扇区的开头,需要在当前扇区之前填充其他的数据。这样,写入的数据就会乱码。
另外,如果这个文件开启了缓存,那么文件指针的位置可能是有误差的。这个误差会导致这个文件指针偏移定位至某个位置,就会错乱,为了解决这个问题,我们需要准确地设定文件指针的位置。
为了解决连续写入乱码的问题,我们需要在每次写入数据前,计算本次文件指针的移动偏移量,以此来避免数据的重复写入。计算方法如下:
(1) 首先,我们需要知道文件中已经写入了多少字节的数据,这可以通过fatfs文件操作API中的f_size()函数获得。
(2) 接着,我们需要计算当前需要写入的数据与上一次写入的数据之间的间隔(也就是偏移量)。如果上一次写入是写入到扇区中间,那么下一次就需要先把扇区填充满,之后再写入数据。具体的计算公式:偏移量=f_size/sector_size*sector_size+f_size%sector_size。
(3) 最后,我们需要根据计算出来的偏移量更新文件指针的位置。这可以通过fatfs文件操作API中的f_lseek()函数实现。我们可以在每次写入数据之前,先通过该函数调整文件指针的位置,以此避免写入数据重复的问题。