📄 sdfilelib.c
字号:
//current_clust=m;
//====================
file[pfile].current_sector=(n%(Init_Arg1.SectorsPerClust*512))/512; //不足一簇的扇数
file[pfile].current_byte=(n%(Init_Arg1.SectorsPerClust*512))%512; //在一扇中的哪一位
}
//----------------------读取文件内容-------------------------
void fread(uchar pfile,uchar *store,uint read_num)
{
uint i,m;
//bit flag=1;
se=(file[pfile].current_clust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector+file[pfile].current_sector;//文件都是从第三簇开始的
Read_SD_Sector(se);
m=file[pfile].current_byte;
for(i=0;i<read_num;i++)
{
//if(flag)
//{
if(m+i==512) //如果所需数据不在同一扇区
{
if(file[pfile].current_sector==(Init_Arg1.SectorsPerClust-1)) //如果所需数据不在同一簇
{
file[pfile].current_clust=FAT32_GetNextCluster(file[pfile].current_clust);
se=(file[pfile].current_clust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector;
Read_SD_Sector(se);
}
else
se++;
Read_SD_Sector(se);
m=0-i;
//flag=0;
}
//}
store[i]=FAT32_Buffer[m+i];
}
}
//-----------------对文件增加一个簇------------------------------------
unsigned long Add_Newclust(unsigned char pfile)
{
// static unsigned int Save_Fat_Sectors;
unsigned char flag=0,j;
unsigned long Clust_thing,current_clust,i;
struct FAT32_FAT *Test;
struct FAT32_FAT_Item *Test_Item,Test_Item_2={0xff,0xff,0xff,0x0f};
for(i=Init_Arg1.FirstFATSector;i<=Init_Arg1.FirstFATSector+Init_Arg1.FATsectors;i++)//查询整个FAT表中的空簇
{
se=i;
Read_SD_Sector(se);
Test=(struct FAT32_FAT*)FAT32_Buffer;
for(j=0;j<128;j++)
{
Test_Item=&(Test->Items[j]);
Clust_thing=Little_To_Big((unsigned char*)Test_Item,4);
if(Clust_thing==0) //找到一个空簇
{
Test->Items[j]=Test_Item_2; //创建一个簇后并连接到文件的结尾
Write_SD_Sector(se);
current_clust=j+(i-Init_Arg1.FirstFATSector)*128; //计算该处簇号
Clust_thing=current_clust;
Test_Item_2.Item[0]=Clust_thing&0xff;
Clust_thing=current_clust;
Test_Item_2.Item[1]=(Clust_thing>>8)&0xff;
Clust_thing=current_clust;
Test_Item_2.Item[2]=(Clust_thing>>16)&0xff;
Clust_thing=current_clust;
Test_Item_2.Item[3]=(Clust_thing>>24)&0xff;
fseek(pfile,file[pfile].file_size);
se=((file[pfile].current_clust/128)+Init_Arg1.FirstFATSector); //计算文件所在的最后一个族的位置
Read_SD_Sector(se);
Test=(struct FAT32_FAT *)FAT32_Buffer;
Test->Items[file[pfile].current_clust%128]=Test_Item_2;
Write_SD_Sector(se);
flag=1;
break;
//return current_clust=j+(i-Init_Arg1.FirstFATSector)*128; //计算该处簇号
}
}
if(flag==1)
break;
}
return current_clust;
}
//-----------------写入文件内容,只能写在结尾-----------------------------------
void fwrite(uchar pfile,uchar *store,uint write_num)
{
unsigned int i,m;
unsigned long Newclust;
fseek(pfile,file[pfile].file_size); //找到文件的结尾
se=(file[pfile].current_clust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector+file[pfile].current_sector;//文件都是从第三簇开始的
// se1=se;
Read_SD_Sector(se); //读取文件的最后一扇
m=file[pfile].current_byte;
for(i=0;i<write_num;i++)
{
if((m+i)==512) //如果数据同一扇区放不下
{
Write_SD_Sector(se);
// se2=se;
if(file[pfile].current_sector==(Init_Arg1.SectorsPerClust-1)) //如果数据同一簇放不下
{
Newclust=Add_Newclust(pfile);
se=(Newclust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector;
}
else
se++;
m=0-i;
Read_SD_Sector(se);
}
FAT32_Buffer[m+i]=store[i];
}
// se1=se;
Write_SD_Sector(se);
write_size(pfile, write_num); //修变并写入文件的大小
}
//-----------------写入文件大小-----------------------------------
void write_size(unsigned char pfile,unsigned int write_num)
{
unsigned long file_size;
file[pfile].file_size=file[pfile].file_size+write_num; //改变文件的大小增加用‘+’,减小用‘-’
se=file[pfile].file_name_sector;
Read_SD_Sector(se);
file_size=file[pfile].file_size;
FAT32_Buffer[file[pfile].file_name_byte+28]=file_size&0xff;
file_size=file[pfile].file_size;
FAT32_Buffer[file[pfile].file_name_byte+29]=(file_size>>8)&0xff;
file_size=file[pfile].file_size;
FAT32_Buffer[file[pfile].file_name_byte+30]=(file_size>>16)&0xff;
file_size=file[pfile].file_size;
FAT32_Buffer[file[pfile].file_name_byte+31]=(file_size>>24)&0xff;
Write_SD_Sector(se); //写入文件大小
}
//-----------------写入文件内容,删除原来文件内容-----------------------------------
void fwriteall(uchar pfile,uchar *store,uint write_num)
{
unsigned char j=0;
unsigned long clust,next_clust,Newclust;
unsigned int size,i,m=0;
struct FAT32_FAT *Test;
struct FAT32_FAT_Item Test_Item_2={0xff,0xff,0xff,0x0f},Test_Item_3={0,0,0,0};
size=file[pfile].file_size/(512*Init_Arg1.SectorsPerClust);//文件占几个簇
file[pfile].file_size=0;//清除文件大小
//清除文件的簇连接
if(size!=0)
{
//fseek(pfile,0); //得到文件的起始簇
// se2=file[pfile].frist_clust;
clust=FAT32_GetNextCluster(file[pfile].frist_clust); //找到第一簇指向下一簇簇号
se=((file[pfile].frist_clust/128)+Init_Arg1.FirstFATSector);//找到该簇的扇区
// se1=se;
//while(!EA); //用于测试
Read_SD_Sector(se);
Test=(struct FAT32_FAT*)FAT32_Buffer; //类型转换
Test->Items[file[pfile].frist_clust%128]=Test_Item_2; //第一簇送0xff,0xff,0xff,0x0f,以后送{0,0,0,0}
Write_SD_Sector(se);
while(1) //for(i=0;i<size;i++)
{
next_clust=FAT32_GetNextCluster(clust); //找下一簇簇号
se=((clust/128)+Init_Arg1.FirstFATSector);//找到该簇的扇区
Read_SD_Sector(se);
//Test=(struct FAT32_FAT*)FAT32_Buffer; //类型转换
Test->Items[clust%128]=Test_Item_3; //{0,0,0,0}
Write_SD_Sector(se);
clust=next_clust;
if(clust==0x0FFFFFFF)
break;
}
}
se=(file[pfile].frist_clust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector;//
Read_SD_Sector(se);
for(i=0;i<write_num;i++)
{
if(i/512!=0&&i%512==0)
{
Write_SD_Sector(se);
se++;j++;
if(j==Init_Arg1.SectorsPerClust)//即多于一个簇
{
Newclust=Add_Newclust(pfile);
se=(Newclust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector;
j=0;
}
m=512+m;
}
FAT32_Buffer[i-m]=store[i];
}
Write_SD_Sector(se);
write_size(pfile, write_num); //重新写入文件的大小
}
//-----------------汉字库与液晶汉字库的转换-----------------------
void HZKLCD(unsigned char *ch,unsigned char *CH)
{
unsigned char ii,jj,aa,bb,n=0;
//----------------------转换算法---------------
for(ii=0;ii<8;ii++)
{
bb=0;
for(jj=0;jj<8;jj++)
{
aa=ch[2*jj]&0x80;
ch[2*jj]<<=1;
aa>>=(7-jj);
bb=bb|aa;
}
CH[n]=bb;
n++;
bb=0;
for(jj=8;jj<16;jj++)
{
aa=ch[2*jj]&0x80;
ch[2*jj]<<=1;
aa>>=(15-jj);
bb=bb|aa;
}
CH[n]=bb;
n++;
}
for(ii=0;ii<8;ii++)
{
bb=0;
for(jj=0;jj<8;jj++)
{
aa=ch[2*jj+1]&0x80;
ch[2*jj+1]<<=1;
aa>>=(7-jj);
bb=bb|aa;
}
CH[n]=bb;
n++;
bb=0;
for(jj=8;jj<16;jj++)
{
aa=ch[2*jj+1]&0x80;
ch[2*jj+1]<<=1;
aa>>=(15-jj);
bb=bb|aa;
}
CH[n]=bb;
n++;
}
}
//--------------*********地址折半查找法************--------------------
unsigned long find1(unsigned char pfile,unsigned char pfile1,unsigned char len1,unsigned char *array,unsigned char len,unsigned char len2)//
//array 为所找到的内容,len为array内容的长度,最大长度为20 ;len1为一条记录长度
{
unsigned char s,ch[20],ch1[5];
bit m;
unsigned int n,j=0;
int i;
unsigned long N,M; //计算“书籍1.txt”中有多少条记录
//pf=fopen("书籍1 ");
//N=file[pfile].file_size/86; //一条记录是86个字节
N=file[pfile1].file_size/len1; //一条记录的地址占86个字节
j=0;s=0;
for(n=0;n<(log(N)/log(2)+2);n++) //折半查找应该是对数次,‘2’是在附近查找的次数
{ //last_num=n;
i=pow(-1,s)*(N/pow(2,n+1));
if(!i)
{
if(s)
{
if(j==0) //防止找到起始位置出错
j++;
j--;
}
else
{
if(j==(N-1))
j--;
j++;
}
}
else
j=j+i;
M=len1*j;
fseek(pfile1,M); //移动指针位置
fread(pfile1,ch1,len1); //读取文件的条码
M=atoi(ch1);
//se1=M;
M=(M-1)*len2;
// se1=j;
fseek(pfile,M); //移动指针位置
fread(pfile,ch,len); //读取文件的条码
for(i=0;i<len;i++)
{
if(ch[i]==array[i])
m=1;
else if(ch[i]>array[i])
{s=1;m=0;break;}
else
{s=0;m=0;break;} //只要有一位不等就退出
}
if(m)
break;
}
if(m) //找到文件后返回文件的位置
return M;
else
return 55; //没有找到则返回无内容标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -