使用FatF打开文件时覆盖的数据

时间:2016-09-18 17:37:27

标签: stm32 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。

1 个答案:

答案 0 :(得分:0)

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

来自f_open

  

FA_OPEN_APPENDFA_OPEN_ALWAYS相同,但读/写指针设置为文件末尾。

用这个打开文件时:

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将执行的操作,但保持文件打开。来自文档:

  

这适用于在写入模式下长时间打开文件的应用程序,例如数据记录器。在f_write函数之后执行periodic或immediataly的f_sync函数可以最大程度地降低因突然停电或无意识的介质移除而导致数据丢失的风险。

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