// 将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);
}