1

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

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。

4

1 回答 1

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 函数之后执行周期性或立即的 f_sync 函数可以最大程度地降低由于突然断电或意外介质移除而导致数据丢失的风险。

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

于 2016-09-20T18:14:06.633 回答