使用 FatFs 打开文件时数据被覆盖

Data overwritten when opening file using FatFs

如果我关闭一个文件然后重新打开它,我无法在重新打开它后向它写入更多数据,但如果我保持它打开,我可以写任意多行,然后在写完后关闭它。 请参见下面的示例。谢谢

if (f_mount(&FatFs, "", 1) == FR_OK) {
      f_mkdir ("TEST");

      count = 0;
      while(count < 200){

          if(f_open(&fil, "TEST/test.txt", FA_OPEN_ALWAYS | FA_WRITE) != FR_OK){
              break;
          }
          else{
              sprintf(array,"This is file entry number: %d\r\n",count);
              f_puts(array, &fil);
              if(f_close(&fil) != FR_OK){
                  break;
              }
          }
          count++;
      }
      f_mount(0, "", 1);
}

它会计数到最大值,但它只会写入最后一个条目,即 199。

您需要设置打开模式,使其附加到文件而不是在开头写入:

来自f_open

FA_OPEN_APPEND Same as FA_OPEN_ALWAYS except read/write pointer is set end of the file.

当你用这个打开文件时:

f_open(&fil, "TEST/test.txt", FA_OPEN_ALWAYS | FA_WRITE);

您正在打开文件以使用文件开头的写入指针进行写入,因此当您使用以下方式写入文件时:

f_puts(array, &fil);

您覆盖了文件中以前的数据。

如果您将打开方式更改为:

f_open(&fil, "TEST/test.txt", FA_OPEN_APPEND | FA_WRITE);

那么你应该得到你想要的行为。不过,有一个例外,那就是每次 运行 这一次,您将继续追加到文件中。如果不需要,您可能需要先删除文件或先使用 FA_OPEN_ALWAYS 打开它,然后使用 FA_OPEN_APPEND.

重新打开每个通道

根据您要执行的操作,您应该查看 f_sync,它将执行所有清理并写入 f_close 将执行的操作,但保持文件打开。来自文档:

This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync function of periodic or immediataly after f_write function can minimize the risk of data loss due to a sudden blackout or an unintentional media removal.

这几乎涵盖了我能想到的所有情况,了解为什么您可能会反复打开和关闭文件以附加数据,因此这可能是解决您问题的更好方法。