FAT文件系统中如何实现对一个文件进行续写

[复制链接]
5208|9
 楼主| 给力芯片 发表于 2012-1-11 17:38 | 显示全部楼层 |阅读模式
最近在用LM3S8962利用FAT文件系统对SD卡进行读写操作,可以实现对文件读写操作,但发现了一个问题,用如下代码只能实现在SD卡中一行数据:
while(1)
{     
       f_mount(0, &fs);
      res = f_open(&fdst, "dstfile.txt", FA_OPEN_ALWAYS | FA_WRITE);
      int len = strlen(buffer);
      res = f_write(&fdst, buffer,len , &bw);
      f_sync(&fdst);         
      f_close(&fdst);
      f_mount(0, NULL);
}
结果在SD卡中只有一行数据
      f_mount(0, &fs);
      res = f_open(&fdst, "dstfile.txt", FA_OPEN_ALWAYS | FA_WRITE);
      int len = strlen(buffer);
      while(1)
     {
         res = f_write(&fdst, buffer,len , &bw);
          f_sync(&fdst);
     }              
      f_close(&fdst);
      f_mount(0, NULL);
可以实现多行的写操作。我想实现的是,对一个文件进行续写,比如说一个文件现在里面有1K的数据,现在对这个文件进行续写,但是不能将以前的内容覆盖掉。如何实现,请教下高手。
litgb 发表于 2012-1-11 21:21 | 显示全部楼层
我不懂,帮你顶下,望高手解答
peter_zheng 发表于 2012-1-12 10:28 | 显示全部楼层
这不是FAT文件系统的问题,而是文件操作的问题,找个应用程序来读一下吧。
 楼主| 给力芯片 发表于 2012-1-12 13:33 | 显示全部楼层
呵呵,问题已解决,我等把移植完后,把心得和大家分享下,呵呵,感谢大家。
 楼主| 给力芯片 发表于 2012-1-12 13:34 | 显示全部楼层
int main(void)
{
    static FATFS fs;            // Work area (file system object) for logical drive
    static FIL  fdst;      // fsrc,file objects
    static BYTE buffer[4096] = {"123\n"};   // file copy buffer
    static FRESULT res;         // FatFs function common result code
    static WORD bw;         // File R/W countbr,     
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC |
                   SYSCTL_XTAL_8MHZ | SYSCTL_OSC_MAIN);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    while(1)
    {
      f_mount(0, &fs);
      res = f_open(&fdst, "dstfile.txt", FA_OPEN_ALWAYS | FA_WRITE);
      res = f_lseek(&fdst, fdst.fsize);
      int len = strlen(buffer);
      while(1)
      {
        res = f_write(&fdst, buffer,len , &bw);
        f_sync(&fdst);
      }
               
      f_close(&fdst);
      f_mount(0, NULL);
    }
    while(1);
}
这是我的主程序,主要是f_sleek();函数的调用,其作用是找到一个文件的末端。
TI_MCU 发表于 2012-1-12 14:23 | 显示全部楼层
因为f_write写入的时候会盖掉以前的数据,所以需要绕过已经写进去的数据,需要用f_lseek将操作位置向后移动到文件的结尾。这样再次写入的时候就会从现有文件的最后面继续保存。

在f_open后面加上一句f_lseek跳转到文件结尾:

  1. res = f_open(&fdst, "dstfile.txt", FA_OPEN_ALWAYS | FA_WRITE);
  2. res = f_lseek(&fdst, fdst.fsize);
TI_MCU 发表于 2012-1-12 15:10 | 显示全部楼层
汗...中午开着跑了,没看到你自己已经搞出来了  呵呵:lol
suixiaodong 发表于 2012-1-12 15:28 | 显示全部楼层
我不懂,帮你顶下,望高手解答
 楼主| 给力芯片 发表于 2012-1-12 21:33 | 显示全部楼层
7# TI_MCU
呵呵,谢谢TI_MCU,文件系统的东西说多不多,但说少也不少。这次的移植学到了不少的东西,谢谢大家。另外,我打算移植到MSP430上,现在正在搞,前面是在LM3S8962上移植的,用的官网板子上的例程,没有硬件部分。这次在哪430上进行硬件接口层的移植,移植完后,和大家分享,专门开一个帖子,分享下,让更多的人在移植FAT文件系统中少走弯路。这也搞了好几天了,其中有TI_MCU的帮忙,还有在另外一个坛子的朋友的提示。
爱之翼V 发表于 2012-1-16 10:11 | 显示全部楼层
楼主真热心,等着你跟大家分享移植后的帖子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

624

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部