注释转换

《注释转换》

 项目简介:将所有以C语言格式的注释转换成C++注释格式

 开发环境:VS2013、 Windows

 所用技术:文件指针、枚举、结构体指针

 项目特点:

     ● C语言注释格式/**/转换为C++注释//

     ● 利用文件指针打开文件并读写文件,input、output导入导出文件

     ● 定义七个环境(一般情况、换行转换、多行注释、连续注释、匹配问题、连续的

       **/、C++注释),利用枚举标志文件开始和结束

     ● 转换后不得改变原文件的含义并且编译链接无错误

     ● 所有的转换必须符合语法规则,注释转换支持注释嵌套

 

test.c

#include<stdio.h>
#include"AnnotationConvert.h"

int main()
{
	ConvertState ret=AnnotationConvert("input.c", "output.c");
	if (ret == FILE_ERROR)
	{
		printf("打开文件错误\n");
	}
	else if (ret == SUCCESS)
	{
		printf("转换成功\n");
	}
	else if (ret == NO_MATCH)
	{
		printf("不匹配\n");
	}
	return 0;
}


AnnotationConvert.h

#pragma once
#include<assert.h>
#include<errno.h>

typedef enum ConvertState
{
	SUCCESS,
	FILE_ERROR,
	NO_MATCH,
}ConvertState;

typedef enum State
{
	C_BEING,
	C_END,
}State;
ConvertState Convert(FILE *fIn, FILE *fOut)
{
	ConvertState ret= SUCCESS;
	char first, second;
	State tag = C_END;
	assert(fIn);
	assert(fOut);
	do{
		first = fgetc(fIn);
		switch (first)
		{
		case'/':
			second = fgetc(fIn);
			if (second == '*')
			{
				//匹配问题
				if (tag == C_END)
				{
					fputc('/', fOut);
					fputc('/', fOut);
					tag = C_BEING;
				}
				else
				{
					fputc('/', fOut);
					fputc('*', fOut);
				}
			}
			//C++
			else if (second == '/')
			{
				char next;
				fputc('/', fOut);
				fputc('/', fOut);
				do
				{
					next = fgetc(fIn);
					fputc(next,fOut);
					if (next == EOF)
						return ret;
				} while (next != '\n');
			}
			else
			{
				fputc(first, fOut);
				fputc(second, fOut);
			}
			break;
		case'\n'://多行注释
			fputc('\n', fOut);
			if (tag == C_BEING)
			{
				fputc('/', fOut);
				fputc('/', fOut);
			}
			break;
		case'*':
			second = fgetc(fIn);
			if (second == '/')
			{
				//连续注释问题
				char next = fgetc(fIn);
				if (next == '/')
				{
					fputc('\n', fOut);
					fseek(fIn,-1,SEEK_CUR);
				}
				//换行问题
				else if (next != '\n'&&next != EOF)
				{
					fputc('\n',fOut);
					fputc(next,fOut);
				}
				else
				{
					fputc('\n', fOut);
				}
				tag = C_END;
			}
			//连续的*/问题
			else if (second == '*')
			{
				fputc(first, fOut);
				fseek(fIn,-1,SEEK_CUR);
			}
			else
			{
				fputc(first, fOut);
				fputc(second, fOut);
			}
			break;
		default:
			if (first!=EOF)
				fputc(first, fOut);
			break;
		}
	} while (first != EOF);
	if (tag != C_END)
	{
		ret = NO_MATCH;
	}
	return ret;
}
ConvertState AnnotationConvert(const char* inputFile, const char* outputFile)
{
	ConvertState ret;
	FILE *fIn, *fOut;
	fIn = fopen(inputFile,"r");
	if (fIn == NULL)
	{
		printf("打开文件%s失败",inputFile);
		return FILE_ERROR;
	}
	fOut = fopen(outputFile,"w");
	if (fOut == NULL)
	{
		fclose(fIn);
		printf("打开文件%s失败", outputFile);
		return FILE_ERROR;
	}
	ret=Convert(fIn,fOut);
	
	fclose(fIn);
	fclose(fOut);
	return ret;
}

 

input.c

//1.一般问题
// int i=0;

//2.换行问题
//int i=0;
int j = 0;
//int i=0;
int j = 0;

//3.匹配问题
//int i=0;/*xxxxx

//4.多行注释问题
//int i=0;
//int j=1;
//int k=9;
//
int k = 9;

//5.连续注释问题
//
//

//6.连续的**/问题
//*

//7.C++注释问题
// /*xxxxxxxxx*/


output.c

//1.一般问题
/* int i=0;*/

//2.换行问题
/*int i=0;*/int j = 0;
/*int i=0;*/
int j = 0;

//3.匹配问题
/*int i=0;/*xxxxx*/

//4.多行注释问题
/*int i=0;
int j=1;
int k=9;
*/int k = 9;

//5.连续注释问题
/**//**/

//6.连续的**/问题
/***/

//7.C++注释问题
// /*xxxxxxxxx*/

 

你可能感兴趣的:(注释转换)