注释转换用于文件中,将文件里面的C风格的注释,转换为CPP风格的注释。
C风格注释:/* ############ */
CPP风格注释://
本文将从以下方面入手,将所有的情况罗列如下:
从空文件到文件结束,罗列出的各种情况,从而有利于大家的学习。
下面给出文件中的各种情形:
下面将给出此次注释转换的代码,为了方便学习,将封装三个函数。
开始之时,将初始状态赋为空状态
**CommentConvert.h**
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __COMMENTCONVERT_H__ //为了防止头文件的重引用
#define __COMMENTCONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoNULComment(FILE*pfIn, FILE*pfOut, enum STATE *p);//无注释时的处理
void DoCComment(FILE*pfIn, FILE*pfOut, enum STATE *p);//C注释的处理
void DoCPPComment(FILE*pfIn, FILE*pfOut, enum STATE *p);//CPP的注释处理
#endif //__COMMENTCONVERT_H__
CommentConvert.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConvert.h"
void DoNULComment(FILE*pfIn, FILE*pfOut, enum STATE *p)//无注释时的处理
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '/':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case '/': //处理CPP情况
{
fputc(first, pfOut);
fputc(second, pfOut);
*p = CPP_STATE;//回到CPP的状态
}
break;
case '*': // 处理C状况
{
fputc('/', pfOut);
fputc('/', pfOut);
*p = C_STATE;//回到C的状态
}
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case EOF:
fputc(first, pfOut);
*p = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCComment(FILE *pfIn, FILE *pfOut, enum STATE *p)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '*':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case'/'://C注释完毕
{
int third = fgetc(pfIn);//判断是否有换行
if (third == '\n')
{
fputc(third, pfOut);
*p = NUL_STATE;
}
else
{
fputc('\n', pfOut);
ungetc(third, pfIn);
*p = NUL_STATE;
}
break;
}
case'*'://(second)中
ungetc(second, pfIn);//如果接下来仍然是*,则将*返回给pfIn中
fputc(second, pfOut);
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case'/': //first中
{
/* int second = 0;
second = fgetc(pfIn);
switch (second)
{
case'/':
{
fputc(first, pfOut);
fputc(second, pfOut);
*p = CPP_STATE;
}
break;
default:
ungetc(second, pfIn);
fputc(first, pfOut);
fputc(second, pfOut);
break;
}*/
}
*p = NUL_STATE;
break;
case '\n':
{
//int second = fgetc(pfIn);//可以没有
////fputc(second, pfOut);
//if (second == '*')
//{
// ungetc('*', pfIn);
//}
//else
//{
// fputc('/', pfOut);
// fputc('/', pfOut);
//}
fputc(first, pfOut);//连续注释时,在每行的开头加上CPP注释风格
fputc('/', pfOut);
fputc('/', pfOut);
} break;
default:
fputc(first, pfOut);
break;
}
}
void DoCPPComment(FILE*pfIn, FILE*pfOut, enum STATE *p)//CPP的注释处理
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '\n':
fputc('\n', pfOut);
*p = NUL_STATE;
break;
case EOF:
*p = END_STATE;
break;
default:
putc(first, pfOut);
break;
}
}
**test.c**
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentConvert.h"
void CommentConvert(FILE*pfIn, FILE*pfOut)
{
enum STATE s = NUL_STATE;
while (s != END_STATE)
{
switch (s)
{
case NUL_STATE:
DoNULComment(pfIn, pfOut, &s);//传递状态以及文件
break;
case C_STATE:
DoCComment(pfIn, pfOut, &s);
break;
case CPP_STATE:
DoCPPComment(pfIn, pfOut, &s);
break;
default:
break;
}
}
}
void test()
{
FILE *pfIn = NULL;
FILE *pfOut = NULL;
pfIn = fopen("Input.c.txt", "r");//以只读的形式打开
if (pfIn == NULL)
{
perror("use fopen of Input");
exit(EXIT_FAILURE);
}
pfOut = fopen("output.c.txt", "w");
if (pfOut == NULL)
{
perror("use fopen of pfOut");
fclose(pfIn);
exit(EXIT_FAILURE);
}
CommentConvert(pfIn, pfOut);
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
system("pause");
return 0;
}
了解注释转换,对文件的学习有很大的帮助,希望这些可以帮助到大家。