IO注释转换---CPP风格

头文件 convert.h
#ifndef __CONVERT_H_
#define __CONVERT_H_
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#endif //__CONVERT_H_

enum{ CSTATUS, CPPSTATUS, NULLSTATUS,EOFSTATUS };

#define INPUT "input.txt"
#define OUTPUT "output.txt"

void convert_work();
void do_CPP(FILE*opt, FILE*ipt);
void do_C(FILE*opt, FILE*ipt);
void do_NULL(FILE*opt, FILE*ipt);

测试 test.c
#include "convert.h"

int main()
{
	convert_work();
	system("pause");
	return 0;
}

实现 convert.c
#include  "convert.h"
int status = NULLSTATUS;  //定义全局状态变量
void do_NULL(FILE*opt, FILE*ipt)  //空状态
{
	int s = fgetc(opt);  //在opt中读入一个字符
	switch (s)
	{
	case '/':
	{
				int f = fgetc(opt);
				switch (f)
				{
				case'/':fputc('/', ipt);  //如果遇到//将输出并进入CPP状态
					fputc('/', ipt);
					status = CPPSTATUS;
					break;
				case'*':fputc('/', ipt);  //遇到/*发生注释转换//进入C状态
					fputc('/', ipt);
					status = CSTATUS; break;
				case EOF:status = EOFSTATUS; break;//遇到EOF进入EOF状态
				default:fputc('/', ipt);//遇到a/b类似的情况,先输出/
				{
							if (f != '\n')//若/后面不为\n,输出\后的内容
								fputc(f, ipt);
							else         //若为\n直接换行
								fputc('\n', ipt);
				}; break;
				}
	}
		break;
	case EOF:status = EOFSTATUS; break;
	default:fputc(s, ipt); break;  //以上均不满足直接写入ipt
	}
}
void do_C(FILE*opt, FILE*ipt)  //C状态
{
	int c = fgetc(opt);
	switch (c)
	{
	case'*':{
				int s = fgetc(opt);
				switch (s)
				{
				case '/':      //若为*/
				{
							int a = fgetc(opt);  //再获取一个字符判断是否为\n
							if (a != '\n')    //不为\n后面仍有内容
							{
								fputc('\n', ipt);   //换行.退回获取的字符
								ungetc(a, opt);
							}
							else
								fputc('\n',ipt);  //*/后为\n直接换行
							status = NULLSTATUS;  //遇到*/之后的内容不是C状态
				}; break;
			   case EOF:status = EOFSTATUS; break;
			   default:fputc('*', ipt); ungetc(s, opt); status = CSTATUS; break;
				}
	}
		break;
	case'\n':fputc('\n', ipt); fputc('/', ipt); fputc('/', ipt); status = CSTATUS; break;  //在C注释中遇到换行,换行并加//注释
	case EOF:status = EOFSTATUS; break;
	default:fputc(c, ipt); status = CSTATUS; break;  //没有遇到*/均在C状态
	}
}
void do_CPP(FILE*opt, FILE*ipt)  //C++状态
{
	int s = fgetc(opt);
	switch (s)
	{
	case '\n':fputc('\n', ipt); status = NULLSTATUS; break;   //换行即结束注释
	case EOF:status = EOFSTATUS; break;
	default:fputc(s, ipt);  break;
	}
}
void convert(FILE* opt, FILE * ipt)
{
	while (status != EOFSTATUS)
	{
		switch (status)   //4种状态
		{
		case NULLSTATUS:do_NULL(opt, ipt);
			break;
		case CSTATUS:do_C(opt, ipt);
			break;
		case CPPSTATUS:do_CPP(opt, ipt);
			break;
		case EOFSTATUS:   //EOF状态直接退出
			break;
		default:  break;
		}
	}
}

void convert_work()
{
	FILE* opt = fopen(INPUT, "r");   //以读方式打开
	FILE* ipt = fopen(OUTPUT, "w");  //以写方式打开
	if (opt == NULL||ipt==NULL)
	{
		printf("fopen error!\n");
	}
	convert(opt, ipt);
	fclose(opt);
	opt = NULL;
	fclose(ipt);
	ipt = NULL;
}

看一下程序运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值