注释转换

来源:互联网 发布:海岛奇兵妹子升级数据 编辑:程序博客网 时间:2024/05/29 05:07

//   将c语言注释转化为cpp注释

//头文件 "commentconvert.h"

#ifndef __COMMENT_CONVERT_H__#define __COMMENT_CONVERT_H__#include<stdio.h>#include<stdlib.h>enum STATE      //枚举四种状态{NUL_STATE, C_STATE, CPP_STATE, END_STATE};void CommentConvert1(FILE *pfin,FILE * pfout);                 //转换函数void DoNULConvert1(FILE *pfin,FILE * pfout,enum STATE * state);//无状态的转换void DoCConvert1(FILE *pfin,FILE * pfout,enum STATE * state);  //c语言状态的转换void DoCPPConvert1(FILE *pfin,FILE * pfout,enum STATE * state); //cpp状态的转换#endif


主函数部分

void CommentConvert1(FILE *pfin,FILE * pfout){enum STATE state =NUL_STATE; while(state != END_STATE) {switch(state)    //判断注释类型,调用对应的函数{case NUL_STATE:    {DoNULConvert1(pfin,pfout,&state);}break;case C_STATE:{DoCConvert1(pfin,pfout,&state);}break;case CPP_STATE: {DoCPPConvert1(pfin,pfout,&state);}break;default:break;}}}void DoNULConvert1(FILE *pfin,FILE * pfout,enum STATE * state)   {  int first = fgetc(pfin);    //从文件读取数据int second;  switch(first)  {  case'/':  second = fgetc(pfin);  if(second == '*')  {  fputc(first,pfout);  //将'/'写入文件  fputc('/',pfout);  *state = C_STATE ;     //c注释,当然此代码只是记录注释的状态,也可不写}  else if(second == '/')  {  fputc(first,pfout);  fputc(second,pfout);  *state = CPP_STATE ;    }  else    {  fputc(first,pfout);  fputc(second,pfout);  }   break;  case EOF:  fputc(first,pfout);  *state = END_STATE ;   break;  default:   fputc(first,pfout);  break;  }  }  void DoCConvert1(FILE *pfin,FILE * pfout,enum STATE * state)  {  int first = fgetc(pfin);  int second = 0;  switch(first)  {  case '*':  second = fgetc(pfin);  if(second == '/')  {  int third = fgetc(pfin);  *state = NUL_STATE ;  if(third != '\n')  //处理多行注释问题{  fputc('\n',pfout);  ungetc(third,pfin);   }  if(third == '\n')  {  fputc(third,pfout);  }  }  else  {  fputc(first,pfout);  ungetc(second,pfin);  }  break;  case '\n':   fputc(first,pfout);  fputc('/',pfout);  fputc('/',pfout);  break;  case EOF:  fputc(first,pfout);  *state = END_STATE ;  break;  default:  fputc(first,pfout);  break;  }  }   void DoCPPConvert1(FILE *pfin,FILE * pfout,enum STATE * state) //若是cpp注释的话无需处理直接读取即可{  int first = 0;  first = fgetc(pfin);  switch(first)  {  case'\n':   fputc(first,pfout);  *state = NUL_STATE ;  break;  case EOF:  fputc(first,pfout);  *state = END_STATE ;  break;  default :  fputc(first,pfout);  break;  }  }  


//测试区

void text1(){FILE *pfin = NULL;//定义两文件指针FILE *pfout= NULL;pfin = fopen("input.c","r");//打开 读取 的文件 if(pfin == NULL){perror("input file open:");//读取失败exit(EXIT_FAILURE);}pfout = fopen("output.c","w");//打开 要写入 的文件 if(pfout ==NULL){perror("output file open:");//读取失败fclose(pfin);//要将读文件关闭取的exit(EXIT_FAILURE);}CommentConvert1(pfin,pfout); printf("转换成功\n");fclose(pfin);//关闭两文件fclose(pfout);}

//cpp注释转化为c语言注释也同理函数并没有多大的变化

#ifndef __COMMENT_CONVERT_H__#define __COMMENT_CONVERT_H__#include<stdio.h>#include<stdlib.h>enum STATE  {NUL_STATE, C_STATE, CPP_STATE, END_STATE};void CommentConvert2(FILE *pfin,FILE * pfout);void DoNULConvert2(FILE *pfin,FILE * pfout,enum STATE * state);void DoCConvert2(FILE *pfin,FILE * pfout,enum STATE * state);void DoCPPConvert2(FILE *pfin,FILE * pfout,enum STATE * state);#endif


//主函数

void CommentConvert2(FILE *pfin,FILE * pfout){enum STATE state =NUL_STATE; while(state != END_STATE) {switch(state){case NUL_STATE:{DoNULConvert2(pfin,pfout,&state);}break;case C_STATE:{DoCConvert2(pfin,pfout,&state);}break;case CPP_STATE: {DoCPPConvert2(pfin,pfout,&state);}break;default:break;}}}void DoNULConvert2(FILE *pfin,FILE * pfout,enum STATE * state){int first = 0;int second = 0;first = fgetc(pfin); switch( first){case '/':{second = fgetc(pfin); switch(second){case '*': {fputc(first,pfout); fputc(second,pfout);//*state = C_STATE; }break;case '/': {fputc('/',pfout); fputc('*',pfout);//*state  = CPP_STATE;   }break;default:     {fputc(first,pfout);  ungetc(second,pfin);}break;}}break;case EOF: {fputc(first,pfout); //*state = END_STATE; }break;default:  {fputc(first,pfout); }break ;}}  void DoCPPConvert2(FILE *pfin,FILE * pfout,enum STATE * state){int first = 0;int second = 0;int third = 0;first = fgetc(pfin);switch(first){case '\n' :  {second = fgetc(pfin);switch(second){case '/':{third =  fgetc(pfin);if(third =='*'){fputc('*',pfout);fputc('/',pfout);fputc(first,pfout);fputc(second,pfout);fputc(third,pfout);*state = C_STATE;}else if(third =='/'){fputc(first,pfout);}}break;case EOF:fputc('*',pfout);fputc('/',pfout);fputc(first,pfout);fputc(second,pfout);*state = END_STATE;break;default:fputc('*',pfout);fputc('/',pfout);fputc(first,pfout);fputc(second,pfout);*state = NUL_STATE;break;}}break;case '*':{second = fgetc(pfin);if(second == '/'){;}else{ungetc(second,pfin);fputc(first,pfout);}}break;default:fputc(first,pfout);break;}} void DoCConvert2(FILE *pfin,FILE * pfout,enum STATE * state){int first = 0;int second = 0;int third = 0;first = fgetc(pfin);switch(first) {case '*':    {second = fgetc(pfin);  switch(second){case '/':  {fputc(first,pfout);fputc(second,pfout);*state = NUL_STATE;}break;default :{fputc(first,pfout);ungetc(second,pfin); }break;    }}break;default:fputc(first,pfout); break;}}

//测试区

void text2(){FILE *pfin = NULL;//定义两文件指针FILE *pfout= NULL;pfin = fopen("input.c","r");//打开 读取 的文件 if(pfin == NULL){perror("input file open:");//读取失败exit(EXIT_FAILURE);}pfout = fopen("output.c","w");//打开 要写入 的文件 if(pfout ==NULL){perror("output file open:");//读取失败fclose(pfin);//要将读文件关闭取的exit(EXIT_FAILURE);}CommentConvert2(pfin,pfout);printf("转换成功\n");fclose(pfin);//关闭两文件fclose(pfout);}

 



1 0
原创粉丝点击