⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 AT89C51 MP3源程序AT89C51 MP3源程序 SD AT89C51 MP3源程序AT89C51 MP3源程序 SD
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -