有关注释转换de实现

来源:互联网 发布:mysql完全手册 编辑:程序博客网 时间:2024/06/05 00:21

注释转换用于文件中,将文件里面的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;}

了解注释转换,对文件的学习有很大的帮助,希望这些可以帮助到大家。

原创粉丝点击