项目描述:
利用c语言文件IO来实现c,c++源代码中注释内容的转换:c注释转换为C++风格注释。
练习目的:
c语言,函数,预处理,文件IO,状态机编程
定位:
巩固语法基础。适合初学。
先看头文件
#pragma once
enum//枚举
{
NULLSET,
CSET,
CPPSET,
EOFSET
};
#include<stdlib.h>
#define INPUT "input.txt"//文件名
#define OUTPUT "output.txt"
void converter_mian();
void converter_null(FILE *ipf,FILE *opf);
void converter_cpp(FILE *ipf,FILE *opf);
void converter_c(FILE *ipf,FILE *opf);
函数功能:
#include<stdio.h>
#include"converter.h"
static int status = NULLSET;
void converter_null(FILE *ipf,FILE *opf)//普通文字
{
int c = fgetc(ipf);
switch(c)
{
case '/': //遇到/时候对其进行判断
{
int n = fgetc(ipf);
switch(n)
{
case '/': //这时对其进行cpp模式
{
fputc('/',opf);
fputc('/',opf);
status = CPPSET;
}
break;
case '*': //进行c模式
{
fputc('/',opf);
fputc('/',opf);
status = CSET;
}
break;
case EOF:
status = EOFSET;
break;
default:
fputc('/',opf);
fputc(c,opf);
break;
}
}
break;
case EOF: // 文件结尾
status = EOFSET;
break;
default :
fputc(c,opf); //对普通字符进行读取
break;
}
}
void converter_c(FILE *ipf,FILE *opf)//c语言注释
{
int c = fgetc(ipf);
switch(c)
{
case '*': //遇到*时进行c注释结尾判断
{
int n = fgetc(ipf);
switch(n)
{
case '/': //注释结尾
{
fputc('\n',opf); //进行换行
status = NULLSET;
}
break;
default:
ungetc(n,ipf); // 排除 /****/这种情况
status = NULLSET;
break;
}
}
break;
case '\n': //进行多行注释
fputc('\n',opf);
fputc('/',opf);
fputc('/',opf);
break;
case EOF: //文件结尾
status = EOFSET;
break;
default :
fputc(c,opf);
break;
}
}
void converter_cpp(FILE *ipf,FILE *opf)//cpp注释
{
int c = fgetc(ipf);
switch(c)
{
case'\n': //注释完一行进行换行
fputc('\n',opf);
status = NULLSET;
break;
case EOF: //文件结尾
status = EOFSET;
break;
default : //读取下一个字符
fputc(c,opf);
break;
}
}
void converter_mian()//函数体
{
FILE *ipf = fopen(INPUT,"r");
FILE *opf = fopen(OUTPUT,"w");
if (ipf == NULL || opf == NULL) //判断文件是否被正常打开
{
fprintf(stderr,"open defeat\n");
exit(1);
}
while(status != EOFSET)
{
switch(status) //判断模式
{
case NULLSET:
{
converter_null(ipf,opf);
}
break;
case CSET:
{
converter_c(ipf,opf);
}
break;
case CPPSET:
{
converter_cpp(ipf,opf);
}
break;
case EOFSET:
break;
default :
break;
}
}
fclose(ipf);
fclose(opf);
}
主函数测试
#include<stdio.h>
#include"converter.h"
int main()
{
converter_mian();
return 0;
}
测试必须有测试用例,我们就来用input.txt文件和output.txt文件来进行测试。
来看看测试结果。