OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18587|回复: 8

请教FAT下面F_Read驱动:如何读取被打开文件某个位置前面的一个位置上的数据

[复制链接]

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2011-3-14
在线时间
0 小时
发表于 2011-5-20 11:43:34 | 显示全部楼层 |阅读模式
板子用的是原子的。。。
在用函数void F_Open(FileInfoStruct *FileInfo)打开某个文件(比方说txt文件)以后,再利用F_Read(FileInfoStruct *FileInfo,u8 *buf) 读到文件的512数据到ram中的缓冲buf中,但是随着FileInfo->F_Offset++;,F_Read(..)只能往后读取文件的数据,而不能回到前面的某个位置上读。。。就像是一个文档只能往下翻而不能往上翻一样,我现在希望可以从文件遍历指针当前位置前的一个位置再开始读后面的数据,打个比方。。。
文件a.txt的数据
———————————————————————————————-----------------------------------------------------------
0x12 0x34 0x56 0x78 0x90 0xa5 0xb6 0xc7 ................. 0x40 0x56 0xf2 0xe4 0x58 0xa8 0x90 0x b0 ...........
                                       |→   length   |                  ↑*pd(遍历指针)
-----------------------------------------------------------------------------------------------------------------
其中0 < length < F_Size 
此刻遍历指针指向数据0x40这个数据位置上,但是我想要指针跳到文件的第三个位置(数据为0x56)上接着遍历。。。。
这个F_Read(..)...要怎么的写呢?请教啊。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-20 12:20:40 | 显示全部楼层
回复【楼主位】随心:
-----------------------------------------------------------------------
可以参考下fatfs,fatfs里面有一个f_lseek的函数,可以用来设定当前的读写指针的.
例如:f_lseek(3),到了你的0X56的地址.
其实这个就是一个在文件里面的偏移.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2011-3-14
在线时间
0 小时
 楼主| 发表于 2011-5-20 15:19:08 | 显示全部楼层
回复【2楼】正点原子:
-----------------------------------------------------------------------
我的想法是这样的。。。
每次读文件的时候总是只能读出512个字节,一个文件分好多次才能读出来,当第n次调用函数F_Read(..)的得到文件的数据,会在ram中直接覆盖了第n - 1次的缓冲数据,如果在当前的一个缓冲中记下一个地址,在读下一个512字节的时候也会被覆盖~原来地址的数据也会改变。
所以,能不能说。。。找一个办法可以读到前面的一个记录指针所在的512字节的数据。。???
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2011-3-14
在线时间
0 小时
 楼主| 发表于 2011-5-20 17:00:06 | 显示全部楼层
回复【2楼】正点原子:
-----------------------------------------------------------------------
我忽然间想到一个小办法。。。。。
定义一个这样的接口:
//FileInfo: 文件结构信息引用
//buf: 数据缓存
//offset: 缓冲偏移量
//返回值:读取成功返回1,否则返回0
unsigned char F_Read(FileInfoStruct *FileInfo,u8 *buf, int offset)
{
DWORD sector;       
sector=fatClustToSect(FileInfo->F_CurClust);  //得到目标簇号对应的扇区号
FileInfo->F_Offset = FileInfo->F_Offset +  offset;    //
if(SD_ReadSingleBlock(sector+FileInfo->F_Offset,buf))return 0;//读数错误
FileInfo->F_Offset++;
if(FileInfo->F_Offset==SectorsPerClust) //簇的尽头,换簇
{
FileInfo->F_Offset=0;     
FileInfo->F_CurClust=FAT_NextCluster(FileInfo->F_CurClust);//读取下一个簇号
if((FAT32_Enable==0&&FileInfo->F_CurClust==0xffff) \
||FileInfo->F_CurClust==0x0ffffff8||FileInfo->F_CurClust == 0x0fffffff)return 0;//error     

return 1;//读取成功
}
当offset = 0的时候,函数读取下一个512缓冲区的数据
当offset > 0的时候,读取后面第offset + 1个缓冲数据
当offset < 0的时候,读取前面第offset个缓冲区的数据
文件就摆在那里,整个文件的F_Offset大小也是可以获取的,是可以这样的吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-20 17:48:55 | 显示全部楼层
回复【4楼】随心:
-----------------------------------------------------------------------
实测一下,就知道了.
其实这个不是那么好做的,原因主要是簇只能向下查找,并不能向上查找.也就是你到了某个簇之后,并不知道前一个簇是多少,你得记下来,或者从头开始找起.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2011-3-14
在线时间
0 小时
 楼主| 发表于 2011-5-24 09:49:40 | 显示全部楼层
回复【5楼】正点原子:
回复【4楼】随心: ----------------------------------------------------------------------- 实测一下,就知道了. 其实这个不是那么好做的,原因主要是簇只能向下查找,并不能向上查找.也就是你到了某个簇之后,并不知道前一个簇是多少,你得记下来,或者从头开始找起. 
---------------------------------
实测显示,上函数没有发挥任何作用。。。。郁闷
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-24 10:02:50 | 显示全部楼层
回复【6楼】随心:
---------------------------------
呵呵,所以不是那么简单的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2011-3-14
在线时间
0 小时
 楼主| 发表于 2011-5-24 10:54:36 | 显示全部楼层
回复【7楼】正点原子:
回复【6楼】随心: --------------------------------- 呵呵,所以不是那么简单的.
---------------------------------
能不能这样咧|?
F_Size/512计算文件被遍历完至少要缓存的次数,然后通过malloc()给设置一个数组,记录每次得到当前簇号对应的扇区号,呵呵。。。这样可行不?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-24 12:29:05 | 显示全部楼层
回复【8楼】随心:
---------------------------------
你会发现会占用很大的内存.
你可以自己算算.注意扇区地址是32位的哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表