描述:
利用C语言文件IO来实现C、C++源代码中注释内容的转换:将C注释转换为C++风格的注释
技术特点:
C语言、函数、预处理、文件IO、状态机编程
convert.h
#ifndef __CONVERT_H__
#define __CONVERT_H__
#include <stdio.h>
#include <stdlib.h>
#define INPUT "input.txt"
#define OUTPUT "output.txt"
enum status
{
NULLSTAT,
CSTAT,
CPPSTAT,
EOFSTAT
};
void convert_main();
#endif//__CONVERT_H__
convert.c
#define _CRT_SECURE_NO_WARNINGS
#include "convert.h"
static int status = NULLSTAT;
void do_nullstat(FILE *ipf, FILE *opf)//普通模式
{
int c = fgetc(ipf);
switch (c)
{
case '/':
{
int s = fgetc(ipf);
switch (s)
{
case '/':
fputc('/', opf);
fputc('/', opf);
status = CPPSTAT;//转换到C++注释
break;
case '*':
fputc('/', opf);
fputc('/', opf);
status = CSTAT;//转换到C注释
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc('/', opf);
fputc(s, opf);
break;
}
}
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, opf);
break;
}
}
void do_cstat(FILE *ipf, FILE *opf)//C注释
{
int c = fgetc(ipf);
switch (c)
{
case '*':
{
int s = fgetc(ipf);
switch (s)
{
case '/'://注释结尾
fputc('\n', opf);//换行
status = NULLSTAT;
break;
default:
ungetc(s, ipf);//排除**/的情况
status = NULLSTAT;
break;
}
}
break;
case '\n'://多行注释
fputc('\n', opf);
fputc('/', opf);
fputc('/', opf);
break;
case EOF://文件结尾
status = EOFSTAT;
break;
default://读取下一个字符进行判断
fputc(c, opf);
break;
}
}
void do_cppstat(FILE *ipf, FILE *opf)//C++注释
{
int c = fgetc(ipf);
switch (c)
{
case '\n':
fputc('\n', opf);//换行
break;
case EOF://文件结尾
status = EOFSTAT;
break;
default://读取下一个字符进行判断
fputc(c, opf);
break;
}
}
static void convert_work(FILE *ipf, FILE *opf)
{
while (status != EOFSTAT)
{
switch (status)//判断模式
{
case NULLSTAT:
do_nullstat(ipf, opf);
break;
case CSTAT:
do_cstat(ipf, opf);
break;
case CPPSTAT:
do_cppstat(ipf, opf);
break;
case EOFSTAT:
break;
default:
break;
}
}
}
void convert_main()
{
FILE *ipf = fopen(INPUT, "r");
FILE *opf = fopen(OUTPUT, "w");
if (ipf == NULL || opf == NULL)//判断文件是否已打开
{
fprintf(stderr, "open file erro\n");
exit(1);
}
convert_work(ipf, opf);
fclose(ipf);
fclose(opf);
}
main.c
#include "convert.h"
int main()
{
convert_main();
system("pause");
return 0;
}
用input.txt和output.txt进行测试