#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小时内删除。