有关注释转换de实现

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值