1. 程式人生 > >註釋轉換(C++小專案)

註釋轉換(C++小專案)

將所有以C語言格式的註釋轉換成C++註釋格式,利用檔案指標開啟檔案並讀寫檔案,input,output匯入匯出檔案,轉換後不得改變原檔案的含義並且編譯連線無錯誤,所有的轉換必須符合語法規則,註釋轉換支援註釋巢狀。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef enum ConverState
{
	c_open,
	c_close
}ConverState;
typedef enum State
{
	SUCCESS,
	FILE_ERROR,
	NO_MATCH
}State;

ConverState Convert(FILE *fIn, FILE *fOut)
{
	State ret = SUCCESS;
	char first, second, get;
	ConverState tag = c_close;
	assert(fIn);
	assert(fOut);
	get = fgetc(fIn);
	do{
		first = get;
		switch (first)
		{
			case '/'://正常問題
				second = fgetc(fIn);
				if (second == '/')
				{
					// 7.C++註釋問題
					fputc('/', fOut);
					while (get != '\n')
					{
						fputc(get, fOut);
						get = fgetc(fIn);
					}
					fseek(fIn, -1, SEEK_CUR);
				}
				else if (second == '*')
				{    // 3.匹配問題
					if (tag==c_close)
					{
						fputc('/', fOut);
						fputc('/', fOut);
						tag = c_open;
					}
					else 
					{
						fputc('/', fOut);
						fputc('*', fOut);
					}	
				}
				else 
				{
					fputc(first, fOut);
				}
				break;
			case '*':
				second = fgetc(fIn);
				if (second == '/')
				{    // 2.換行問題
					char next = fgetc(fIn);
					fputc('\n', fOut);
					if (next != '\n'&& next!=EOF)
					{
						// 5.連續註釋問題
						fseek(fIn, -1,SEEK_CUR);
					}
					tag = c_close;
				}
				else
				{
					fputc(first, fOut);
					// 6.連續的**/問題
					fseek(fIn, -1, SEEK_CUR);
				}
				break;
			case'\n':// 4.多行註釋問題
				fputc('\n', fOut);
				if (tag == c_open)
				{
					fputc('/', fOut);
					fputc('/', fOut);
				}
				break;
			default:
				fputc(first, fOut);
				break;		
		}
		get = fgetc(fIn);
	} while (get != EOF);
	return ret;
}

ConverState AnnotationConvert(const char * inputFile, const char * outputFile)
{
	State ret;
	FILE *fOut, *fIn;
	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;
}