打印

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

[复制链接]
4382|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 | 只看该作者
呵呵,问题已解决,我等把移植完后,把心得和大家分享下,呵呵,感谢大家。

使用特权

评论回复
5
给力芯片|  楼主 | 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();函数的调用,其作用是找到一个文件的末端。

使用特权

评论回复
6
TI_MCU| | 2012-1-12 14:23 | 只看该作者
因为f_write写入的时候会盖掉以前的数据,所以需要绕过已经写进去的数据,需要用f_lseek将操作位置向后移动到文件的结尾。这样再次写入的时候就会从现有文件的最后面继续保存。

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

res = f_open(&fdst, "dstfile.txt", FA_OPEN_ALWAYS | FA_WRITE);
res = f_lseek(&fdst, fdst.fsize);

使用特权

评论回复
7
TI_MCU| | 2012-1-12 15:10 | 只看该作者
汗...中午开着跑了,没看到你自己已经搞出来了  呵呵:lol

使用特权

评论回复
8
suixiaodong| | 2012-1-12 15:28 | 只看该作者
我不懂,帮你顶下,望高手解答

使用特权

评论回复
9
给力芯片|  楼主 | 2012-1-12 21:33 | 只看该作者
7# TI_MCU
呵呵,谢谢TI_MCU,文件系统的东西说多不多,但说少也不少。这次的移植学到了不少的东西,谢谢大家。另外,我打算移植到MSP430上,现在正在搞,前面是在LM3S8962上移植的,用的官网板子上的例程,没有硬件部分。这次在哪430上进行硬件接口层的移植,移植完后,和大家分享,专门开一个帖子,分享下,让更多的人在移植FAT文件系统中少走弯路。这也搞了好几天了,其中有TI_MCU的帮忙,还有在另外一个坛子的朋友的提示。

使用特权

评论回复
10
爱之翼V| | 2012-1-16 10:11 | 只看该作者
楼主真热心,等着你跟大家分享移植后的帖子

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

624

帖子

0

粉丝