c语言小项目---注释转换

来源:互联网 发布:程序员基础知识 编辑:程序博客网 时间:2024/05/21 10:47
```//CommentConvert.h文件#ifndef __COMMENT_CONVERT_H__#define __COMMENT_CONVERT_H__#include <stdio.h>#include <stdlib.h>enum Status{    NUL_STATUS,//无状态    C_STATUS,//C状态下    CPP_STATUS,//在C++状态下    END_STATUS//结束状态};void CommentConvert();void DoConvertWork(FILE* pfIn, FILE* pfOut);void DoNulStatus(FILE* pfIn, FILE* pfOut, enum Status* status);void DoCStatus(FILE* pfIn, FILE* pfOut, enum Status* status);void DoCppStatus(FILE* pfIn, FILE* pfOut, enum Status* status);#endif        //__COMMENT_CONVERT_H__
//ConmmentConvert.c文件#define _CRT_SECURE_NO_WARNINGS 1  #include"CommentConvert.h"enum STATUS status = NUL_STATUS;void DoNulStatus(FILE *pfIn, FILE *pfOut, enum Status*status){    int first = 0;    int second = 0;    first = fgetc(pfIn);    switch (first)    {    case '/':        second = fgetc(pfIn);        if (second == '/')        {            fputc('/', pfIn);            fputc('/', pfOut);            *status = CPP_STATUS;   //在无状态下遇到"//"直接将"//"写进去,并进入cpp状态          }        else if (second == '*')        {            fputc(first, pfIn);            fputc('/', pfOut);            *status = C_STATUS;//在无状态下遇到/*要将/*变成//写进去,并进入c状态          }        else        {            fputc(first, pfOut);            fputc(second, pfOut);//遇到其他字符时直接写进去,状态不改变。          }        break;    case EOF:        status = END_STATUS;//如果遇到EOF,进入结束状态          break;    case '"':        fputc(first, pfOut);        //state = STR_STATUS;//如果遇到",进入字符串状态          break;    default:        fputc(first, pfOut);//其他情况的字符,直接写进去就行          break;    }}void DoCStatus(FILE *pfIn, FILE *pfOut, enum Status* status){    int first = 0;    int second = 0;    first = fgetc(pfIn);    switch (first)    {    case '*':        second = fgetc(pfIn);        if (second == '/')  // 遇到*/ 说明c的注释结束,切换到无状态          {            status = NUL_STATUS;            second = fgetc(pfIn);            if (second != '\n')            {                fputc('\n', pfOut);    //如果/后边的字符不是回车,需要写进去回车,然后再把独到的字符放回                  ungetc(second, pfIn);            }            else            {                ungetc(second, pfIn);//如果是回车,把回车放回              }        }        else        {            fputc(first, pfOut);//如果遇到*,但是后边不是/,把*放进去,*后边的字符放回        }        break;    case '\n':        fputc(first, pfOut);//如果需要回车,回车写入,在写入//状态不变。          fputc('/', pfOut);        fputc('/', pfOut);        break;    default:        fputc(first, pfOut);        break;    }}void DoCppStatus(FILE *pfIn, FILE *pfOut, enum Status*status){    int first = 0;    int fgetc(pfIn);    first = fgetc(pfIn);    switch (first)    {    case '\n':        fputc(first, pfOut);//cpp状态,如果遇到回车,cpp状态结束,无状态          status = NUL_STATUS;        break;    default:        if (first == EOF)        {            status = END_STATUS;        }        else        {            fputc(first, pfOut);        }        break;    }}void DoConvertWork(FILE*pfln, FILE*pfOut){    enum STATE status = NUL_STATUS;    while (status != END_STATUS)    {        switch (status)        {        case NUL_STATUS:            DoNulStatus(pfln, pfOut, &status);            break;        case C_STATUS:            DoCStatus(pfln, pfOut, &status);        case CPP_STATUS:            DoCppStatus(pfln, pfOut, &status);            break;        }    }}void CommentConvert(FILE *pfIn, FILE *pfOut){    while (status != END_STATUS)    {        switch (status)        {        case NUL_STATUS:            DoNulStatus(pfIn, pfOut,&status);            break;        case C_STATUS:            DoCStatus(pfIn, pfOut, &status);            break;        case CPP_STATUS:            DoCppStatus(pfIn, pfOut, &status);            break;        case END_STATUS:            break;        }    }}
//test.c测试文件#define _CRT_SECURE_NO_WARNINGS 1  #include"CommentConvert.h"  void test(){    CommentConvert();}int main(){    FILE *pfIn= NULL;    FILE *pfOut = NULL;    printf("注释开始\n");    pfIn = fopen("input.FIlE ","r");    if (NULL == pfIn)    {        perror("open file for read");        exit(EXIT_FAILURE);    }    pfOut = fopen("Output.FILE", "w");    if (NULL == pfOut)    {        fclose(pfIn);        perror("open file for write");        exit(EXIT_FAILURE);    }    CommentConvert(pfIn, pfOut);    printf("注释结束\n");    system("pause");    return 0;}