注释转换

//实现注释转换文件

#include<stdio.h>

#include"convert.h"
#pragma warning(disable:4996)
#pragma warning(disable:4013)
static int status = NULLSTAT;    //定义一个全局变量
void do_null_start(FILE *ipf, FILE *opf)      //实现一般情况下input文件的处理
{
int c = fgetc(ipf);      //从input.c文件中读取一个字符
switch (c)
{
{
case '/':        //如果字符是‘/’
{
int s = fgetc(ipf);     //读取input文件第二个字符
switch (s)
{
case '*':       //如果字符是‘*’
fputc('/',opf);     //在output.c中输出‘// ‘
fputc('/', opf);
status = CSTAT;   
break;
case '/':

fputc('/', opf);       //输出 ’//‘

fputc('/', opf);
status = CPPSTAT;
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc('/', opf);   //当’/‘后面是其他字符时,例如a/b时
ungetc(s, ipf);    //回退到input.c文件中b前面’/‘所在处
status = NULLSTAT;
break;
}


}
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, opf);     //将字符写入output.c
status = NULLSTAT;
break;
}
}
void do_cpp_start(FILE *ipf, FILE *opf)      //c++风格注释的处理
{
int c = fgetc(ipf);   //读入一个字符
switch (c)
{
case '\n':
fputc(c, opf);
status = NULLSTAT;
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, opf);
status = CPPSTAT;
break;


}
}
void do_c_start(FILE *ipf, FILE *opf)      //c风格注释的处理
{
int c = fgetc(ipf);//ipf输入文件流
switch (c)
{
case '\n':
fputc('\n',opf);
fputc('/', opf);
fputc('/', opf);
status = CSTAT;////
break;
case '*':
{
int m = fgetc(ipf);
switch (m)
{
case '/':
{
int n = fgetc(ipf);
if ('\n' == n)
{
fputc('\n', opf);
}
else
ungetc(n, ipf);
}
status = NULLSTAT;
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(m, opf);
status = CSTAT;
break;
}
}
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, opf);
status = CSTAT;
break;


}
}
static void convert_work(FILE *ipf, FILE *opf)
{
while (status != EOFSTAT)
{
switch (status)
{
case NULLSTAT:      //一般情况下 
do_null_start(ipf, opf);
break;
case CSTAT:
do_c_start(ipf, opf);      //c风格注释
break;
case CPPSTAT:
do_cpp_start(ipf, opf);
break;
case EOFSTAT:
//do_eof_start(ipf, opf);
break;
default:
break;


}



}
}
void convert_main()
{
FILE *ipf = fopen(INPUT, "r");            //只读文件input.c
FILE *opf = fopen(OUTPUT, "w");      //只写文件output.c
if (NULL == ipf || NULL == opf)
{
fprintf(stderr, "open file error\n");
exit(1);
}
convert_work(ipf, opf);           //调用文件转换函数
fclose(ipf);      //关闭文件input.c
fclose(opf);        //关闭文件outout.c

}

//实现头文件

#ifndef __CONVERT_H__
#define __CONVERT_H__
enum{
NULLSTAT, 
CSTAT,
CPPSTAT,
EOFSTAT


};
#define INPUT "input.c"
#define OUTPUT "output.c"
void convert_main();


#endif

//测试头文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include"convert.h"
int main()
{

convert_main();
system("pause");
return 0;
}

//注意要先在文件夹中目录下建立一个input.c文件,进行测试

//this is cpp comment
/*int i=0;*/
/*int j=10*/int k = 3;
int n = 20;
/*
int i=0;
int j=20;
int k=250;
*/int q = 9627;
/**/
/*int z=7748258*//*int b=94259*/
// /*dsgfhgwuezjzjb*/

猜你喜欢

转载自blog.csdn.net/lengxinxuexic/article/details/78696826