首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FatFs打开文件时数据被覆盖

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

Stack Overflow用户
提问于 2016-09-19 01:37:27
回答 1查看 3.2K关注 0票数 1

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

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-21 02:14:07

您需要设置您的打开模式,以便它附加到文件,而不是在开头写入:

来自f_openFA_OPEN_APPENDFA_OPEN_ALWAYS 除了读/写指针被设置在文件的末尾之外。

当您使用以下命令打开文件时:

代码语言:javascript
复制
f_open(&fil, "TEST/test.txt", FA_OPEN_ALWAYS | FA_WRITE);

您使用文件开头的写指针打开要写入的文件,因此当您使用以下命令向文件写入时:

代码语言:javascript
复制
f_puts(array, &fil);

覆盖文件中以前的数据。

如果您将打开更改为:

代码语言:javascript
复制
f_open(&fil, "TEST/test.txt", FA_OPEN_APPEND | FA_WRITE);

那么你应该得到你想要的行为。但是有一个例外,那就是每次运行这段代码时,您都会继续向该文件追加内容。如果您不希望这样做,则可能需要先删除该文件,或者最初使用以下命令打开该文件

然后使用以下命令重新打开每个通行证.。

根据您正在尝试做的事情,您应该看一看FA_OPEN_ALWAYS 它将执行所有清理,并将

FA_OPEN_APPEND.将执行,但使文件保持打开状态。从文档中:

代码语言:javascript
复制
f_puts(array, &fil);

这适用于在写入模式下长时间打开文件的应用程序,如数据记录器。执行

代码语言:javascript
复制
f_open(&fil, "TEST/test.txt", FA_OPEN_APPEND | FA_WRITE);

F之后定期或立即的同步函数

写入功能可以最大限度地降低由于突然停电或无意中移出介质而导致数据丢失的风险。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39560704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档