//实现注释转换文件
#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*/