將所有以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;
}