2016-09-18 157 views
1

如果我关闭一个文件然后重新打开它,在重新打开它后我不能写入更多的数据,但是如果我保持打开状态,我可以编写尽可能多的行,然后关闭它我写完了。 请看下面的例子。谢谢。当使用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

回答

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功能可以最大限度地减少由于突然中断或无意中移除介质而导致的数据丢失风险。

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

+0

谢谢,但我使用的版本没有FA_OPEN_APPEND标志。我能用f_seek()实现同样的功能。感谢您的帮助。 –

+0

@o_tech,对我来说它不包含'FA_OPEN_APPEND'似乎很奇怪,因为这是打开文件的一种常见模式。不过,我很高兴你能够解决这个限制。 – rjp

+0

这些都是它的标志:#定义\t FA_READ \t \t \t \t 0×01 的#define \t FA_WRITE \t \t \t 0×02 的#define \t FA_OPEN_EXISTING \t为0x00 的#define \t FA_CREATE_NEW \t \t 0×04 的#define \t FA_CREATE_ALWAYS \t 0x08的 #定义\t FA_OPEN_ALWAYS \t \t 0x10 #define _FA_MODIFIED \t \t 0x20 #define _FA_DIRTY \t \t \t 0x40我试图使用_FA_MODIFY,但它没有工作 –