#include <stdio.h> #include <stdlib.h> #include <string.h>
/* 关键字表宏定义 */ #define KEYTYPE int // #define ERRTYPE -1 #define FILES 0 #define DATE 1 #define FONT_NAME 2 #define FONT_SIZE 3 #define TIMES 4 #define HEAD 5 #define DATA_BEGIN 6 #define DATA_END 7 #define KEYLEN 8
/* LED比特位定义 */ #define DIV (('1')-('0')) // 分隔符代表的整数 01 #define LIMIT_TIMES '0' // 限次/限时控制开关,'0'限次,'1'限时。 #define IS_TIME '0' // 是否定时,'0'定时,'1'不定时 #define TEXT_TYPE '0' // 单行文本类型值(静态0,左滚1,右滚2,上滚3,下滚4) #define FONT_TYPE '0' // 字型(取值为0、4、8、12字符型数字,分别为常规、粗体、斜体、粗斜体)
char *KeyWord[KEYLEN] = {"file","date","font-name","font-size","time","head","data-begin","data-end"};
KEYTYPE MatchWithKeyWord(char *strBuff); // 关键字表查表 int GetString(char *strBuff,FILE *fp); int WriteLedFile(FILE *WriteFilePoint,char *FileNameBuff,char *FontBuff,char *FontSize,char *Times,char *HeadBuff,char *BodyBuff);
int main(int argc,char *argv[]) { FILE *ReadFilePoint; // 读文件指针 FILE *WriteFilePoint; char FileNameBuff[50]; // 暂存生成文件的文件名 char FontBuff[20]; // 暂存主体部分的字体 char FontSize[10]; // 暂存字号 char Times[10]; // 循环次数或者时间 char HeadBuff[50]; // 显示的头 char BodyBuff[600]; // 主体显示部分 char TempBuff[30]; // 临时缓冲区,用来保存待分析的字符串 char ch; // 读取文件字符 int len; // 记录临时缓冲区的长度 /* if(argc != 2) // 参数错误处理 { printf("提示:参数错误!\n\n使用方法:\n%s FileName\n",argv[0]); exit(0); } ReadFilePoint = fopen(argv[1],"r"); // 打开待分析的文件 */ ReadFilePoint = fopen("","r"); if(!ReadFilePoint) // 判断打开是否成功 { printf("文件%s打开失败,可能此文件不在您所指定的目录,请检查后重试!\n",argv[1]); exit(0); } ch = fgetc(ReadFilePoint); while(!feof(ReadFilePoint)) // 读取文件并进行分析 { if(ch == '<') // 读到标记开始 { len = 0;
ch = fgetc(ReadFilePoint); while(ch!='>') // 循环读入标记值到临时缓冲区 { TempBuff[len++] = ch; ch = fgetc(ReadFilePoint); } // 循环结束后,缓冲区中将存放<>之间的字符串 TempBuff[len] = '\0'; // 将字符数组构造成字符串 switch(MatchWithKeyWord(TempBuff)) // 识别每个字符串的类型 { case FILES: // 一
个文件开始则读取下一个字符 ch = fgetc(ReadFilePoint); break; case DATE: // 将日期读入到FileNameBuff缓冲区中用作文件名 GetString(FileNameBuff,ReadFilePoint); break; case FONT_NAME: // 读入字体放入缓冲区FontBuff GetString(FontBuff,ReadFilePoint); break; case FONT_SIZE: // 读入字号 GetString(FontSize,ReadFilePoint); break; case TIMES: // 读入循环次数,显示时间 GetString(Times,ReadFilePoint); break; case HEAD: GetString(HeadBuff,ReadFilePoint); break; case DATA_BEGIN: // 显示主体 GetString(BodyBuff,ReadFilePoint); break; case DATA_END: WriteLedFile(WriteFilePoint,FileNameBuff,FontBuff,FontSize,Times,HeadBuff,BodyBuff); ch = fgetc(ReadFilePoint); break; case ERRTYPE: printf("此文件中存在不可识别的标识符 <%s>,请修正后再试!",TempBuff); exit(0); break; } } else ch = fgetc(ReadFilePoint); } fclose(ReadFilePoint); return 1; }
KEYTYPE MatchWithKeyWord(char *strBuff) // 关键字表查表 { int KeyType = -1; // 返回类型,默认为-1表示不是关键词 int LoopTimes; // 循环次数,为关键字的个数 for(LoopTimes = 0;LoopTimes < KEYLEN;LoopTimes++) { if(!strcmp(strBuff,KeyWord[LoopTimes])) // 字
符串匹配则设置返回类型,跳出循环 { KeyType = LoopTimes; break; } } return KeyType; // 返回 }
int GetString(char *strBuff,FILE *fp) { int i = 0; char ch; ch = fgetc(fp); while(ch!='\n'&&ch!='<') { strBuff[i++] = ch; ch = fgetc(fp); } strBuff[i] = '\0'; return i; }
int WriteLedFile(FILE *WriteFilePoint,char *FileNameBuff,char *FontBuff,char *FontSize,char *Times,char *HeadBuff,char *BodyBuff) { unsigned char buff[1024*1024]; // LED文件缓冲区 int BuffPoint = 0; // 缓冲区指针,指向当前填充字符
printf输出格式右对齐 FileNameBuff[strlen(FileNameBuff)] = '.'; // 以下几句用来根据FileNameBuff构造LED文件名 FileNameBuff[strlen(FileNameBuff)+1] = 'L'; FileNameBuff[strlen(FileNameBuff)+2] = 'E'; FileNameBuff[strlen(FileNameBuff)+3] = 'D'; FileNameBuff[strlen(FileNameBuff)+4] = '\0';
WriteFilePoint = fopen(FileNameBuff,"wb"); // 根据FileNameBuff中的文件名创建相应的文件 if(!WriteFilePoint) { printf("文件%s创建失败,请检查原因后重试!",FileNameBuff); return 0; }
return 1; }
int InitFileHead(int PageNumber,unsigned char *Buff) // 初始化文件头 { int BuffLen = 0;
while(Buff[BuffLen++]); // 取得缓冲区长度
if(BuffLen<4) // 判断缓冲区大小是否足够创建文件头 { printf("文件头缓冲区太小,不足以初始化文件头!"); return 0; // 创建失败后返回0 } Buff[0] = PageNumber; // 初始化页面数 Buff[0] = 0; Buff[1] = 0; Buff[2] = 0;
return 1; // 创建成功后返回1 }
int InitDataPageHead(int OffSet,unsigned char *Buff) // 初始化数据页头部信息 { int BuffLen = 0;
while(Buff[BuffLen++]); // 取得缓冲区长度
if(BuffLen<4) // 判断缓冲区大小是否足够创建数据页头 { printf("数据页缓冲区太小,不足以初始化数据页头部信息!"); return 0; // 初始化失败后返回0 } Buff[0] = OffSet; // 初始化数据
页内部数据偏移 Buff[0] = 0; Buff[1] = 0; Buff[2] = 0;
return 1; // 创建成功后返回1 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论