📄 file.c
字号:
uint32 GetFristSecOfClus(uint16 ClusIndex)
{
return FS_DataStartSec + (ClusIndex - 2) * FS_SecPerClus;
}
/*
;*****************************************************************************************************
;* 函数名称 : GetchFile
;* 描 述 : 从文件读取一个字节
;* 输 入 : fp: 文件指针
;*
;* 输 出 : 文件读取到的一个字节
;*****************************************************************************************************
;*/
uint8 GetchFile(M_FILE fp)
{
uint8 *Buf;
uint8 ch;
uint32 SecOffset;
uint32 SecIndex;
uint32 ReadPoint;
uint16 ByteOffset;
/* 参数无效 */
if (!fp)
{
return '\0';
}
/* 判断文件是否已打开 */
fp = IsFileOpen(fp->fFDT.Name);
if (!fp)
{
return '\0';
}
if (fp->fFDT.FileSize == 0)
{
return '\0';
}
if (fp->Offset >= fp->fFDT.FileSize)
{
return '\0';
}
ReadPoint = fp->Offset;
/* 读写指针所在簇的开始扇区 */
SecIndex = GetFristSecOfClus(fp->CurClus);
/* 读写指针的扇区偏移 */
SecOffset = ReadPoint / 512;
/* 读写指针所在扇区的簇内偏移 */
SecOffset = SecOffset % FS_SecPerClus;
/* 读写指针所在扇区号 */
SecIndex = SecIndex + SecOffset;
/* 打开扇区 */
Buf = OpenSector(SecIndex);
if (Buf == NULL)
{
return '\0';
}
/* 读写指针在所在扇区的字节偏移 */
ByteOffset = ReadPoint % 512;
/* 读数据 */
ch = Buf[ByteOffset];
/* 字节偏移加一 */
if (fp->Offset < fp->fFDT.FileSize - 1)
{
fp->Offset++;
}
return ch;
}
/*
;*****************************************************************************************************
;* 函数名称 : PutchFile
;* 描 述 : 写一个字节到文件
;* 输 入 : fp: 文件指针; ch: 要写入的字节
;*
;* 输 出 : 要写入的字节
;*****************************************************************************************************
;*/
uint8 PutchFile(M_FILE fp, uint8 ch)
{
uint8 *Buf;
uint32 SecOffset;
uint32 SecIndex;
uint16 ByteOffset;
uint16 ClusIndex;
/* 参数无效 */
if (!fp)
{
return '\0';
}
/* 判断文件是否已打开 */
fp = IsFileOpen(fp->fFDT.Name);
if (!fp)
{
return '\0';
}
/* 读写指针在所在扇区的字节偏移 */
ByteOffset = fp->Offset % 512;
/* 读写指针的扇区偏移 */
SecOffset = fp->Offset / 512;
/* 读写指针所在扇区的簇内偏移 */
SecOffset = SecOffset % FS_SecPerClus;
ClusIndex = fp->CurClus;
/* 读写指针所在簇的开始扇区 */
SecIndex = GetFristSecOfClus(ClusIndex);
/* 读写指针所在扇区号 */
SecIndex = SecIndex + SecOffset;
/* 打开扇区 */
Buf = OpenSector(SecIndex);
if (Buf == NULL)
{
return '\0';
}
/* 写数据 */
Buf[ByteOffset] = ch;
WriteSector();
/* 字节偏移加一 */
fp->Offset++;
fp->fFDT.FileSize++;
/* 到达下一扇区 */
if (++ByteOffset == 512)
{
/* 进入下一簇 */
if (++SecOffset == FS_SecPerClus)
{
ClusIndex = GetNextClus(ClusIndex);
/* 当前簇是最后一簇吗 */
if (ClusIndex >= EOF_CLUS_1)
{
/* 增加一个簇 */
ClusIndex = AddNewClus(fp->CurClus);
}
/* 当前簇为下一簇 */
fp->CurClus = ClusIndex;
}
}
return ch;
}
/*
;*****************************************************************************************************
;* 函数名称 : GetNchFile
;* 描 述 : 从文件读取多个字节
;* 输 入 : fp: 文件指针; str: 要写入的地址; nbyte: 字节数
;*
;* 输 出 : 无
;*****************************************************************************************************
;*/
void GetNchFile(M_FILE fp, uint8 *str, uint32 nbyte)
{
while (nbyte-- > 0)
{
*str++ = GetchFile(fp);
}
}
/*
;*****************************************************************************************************
;* 函数名称 : PutNchFile
;* 描 述 : 写多个字节到文件
;* 输 入 : fp: 文件指针; str: 要写入的内容; nbyte: 字节数
;*
;* 输 出 : 无
;*****************************************************************************************************
;*/
void PutNChFile(M_FILE fp, uint8 *str, uint32 nbyte)
{
uint8 ch;
while (nbyte-- > 0)
{
ch = *str++;
if (ch != PutchFile(fp, ch))
return;
}
}
/*
;*****************************************************************************************************
;* 函数名称 : PutSFile
;* 描 述 : 写字符串到文件
;* 输 入 : fp: 文件指针; str: 要写入的内容;
;*
;* 输 出 : 无
;*****************************************************************************************************
;*/
void PutSFile(M_FILE fp, uint8 *str)
{
uint8 ch;
if ((ch = *str++) != '\0')
{
do
{
if (ch != PutchFile(fp, ch))
return;
}while ((ch = *str++) != '\0');
PutchFile(fp, '\0');
}
}
/*
;*****************************************************************************************************
;* 函数名称 : GetSFile
;* 描 述 : 从文件读取字符串
;* 输 入 : fp: 文件指针; str: 要写入的地址;
;*
;* 输 出 : 无
;*****************************************************************************************************
;*/
void GetSFile(M_FILE fp, uint8 *str)
{
uint8 ch;
while (1)
{
ch = GetchFile(fp);
if (ch != '\0')
{
*str++ = ch;
}
else
{
break;
}
}
}
/*
;*****************************************************************************************************
;* 函数名称 : SetFileReadPoint
;* 描 述 : 设置文件读指针
;* 输 入 : fp: 文件指针; x: 读指针位置;
;*
;* 输 出 : 无
;*****************************************************************************************************
;*/
void SetFileReadPoint(M_FILE fp, uint32 x)
{
if (!fp)
return;
if (x >= fp->fFDT.FileSize)
return;
fp->Offset = x;
}
/*
;*****************************************************************************************************
;* 函数名称 : GetFileWRPoint
;* 描 述 : 获得文件读写指针
;* 输 入 : fp: 文件指针;
;*
;* 输 出 : 读写指针
;*****************************************************************************************************
;*/
uint32 GetFileWRPoint(M_FILE fp)
{
if (!fp)
return 0;
return fp->Offset;
}
/*
;*****************************************************************************************************
;* 函数名称 : SetFileWritePoint
;* 描 述 : 设置文件写指针
;* 输 入 : fp: 文件指针; x: 写指针位置;
;*
;* 输 出 : 读写指针
;*****************************************************************************************************
;*/
void SetFileWritePoint(M_FILE fp, uint32 x)
{
uint32 nbyte;
if (!fp)
return;
if (x <= fp->fFDT.FileSize)
{
fp->Offset = x;
}
else
{
fp->Offset = fp->fFDT.FileSize;
nbyte = x - fp->Offset;
while (nbyte-- > 0)
{
PutchFile(fp, 0x00);
}
}
}
/*
;*****************************************************************************************************
;* End of File
;*****************************************************************************************************
;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -