具体代码:
#include <stdlib.h>
#include <stdio.h>
//删除注释
void commentFilter(FILE* sourceFile,FILE* objectFile)
{
char ch;
int flag=1;
bool read = true; //是否可读取,默认为可以
fseek(sourceFile,0,SEEK_END); //定位
int len = (int)ftell(sourceFile); //获得文件总字符长度
//逐个读取文件中的字符
for(int cursor=0;cursor<len;cursor++)
{
fseek(sourceFile,cursor,SEEK_SET);
ch = getc(sourceFile);
switch(ch)
{
//如果遇到双引号,则先将双引号之间的字符写入目标文件
case '"':
{
if(read) //不是在注释行之内
{
putc(ch,objectFile);//写入目标文件
putchar(ch); //输出到控制台
++cursor;
fseek(sourceFile,cursor,SEEK_SET);
char c = getc(sourceFile);
for(;c != '"';)
{
putc(c,objectFile);
putchar(c);
cursor++;
fseek(sourceFile,cursor,SEEK_SET);
c = getc(sourceFile);
}
break;
}
else
break;
}
case '/' :
{
if(read)
{
++cursor;
fseek(sourceFile,cursor,SEEK_SET); //定位到下一个字符,判断是否依然为'/'或'*'
char c = getc(sourceFile);
if(c == '/'){read=false;flag=1;break;}//flag=1,表示遇到的是以//开头的注释
if(c == '*'){read=false;flag=2;break;}//flag=2,表示遇到的是以/*开头的注释
else {--cursor;break;}
}
else
break;
}
case '*' :
{
if(!read) //之前是注释行
{
++cursor;
fseek(sourceFile,cursor,SEEK_SET);
char c = getc(sourceFile);
if(c == '/' && flag == 2)//下一个是'/'且为第二种注释
{
++cursor;
fseek(sourceFile,cursor,SEEK_SET);
ch = getc(sourceFile);
read = true;
}
else
{--cursor;break;}
}
else
break;
}
case '\n' :
{
if(!read && flag!=2)
read = true;
//判断下一行是否为空行,如果是则直接忽略
++cursor;
fseek(sourceFile,cursor,SEEK_SET);
char c = getc(sourceFile);
if(c != '\n') //不是则将cursor还原
--cursor;
break;
}
default:
break;
}
if(read) //将读取到的字符写入目标文件及输出到控制台
{
putchar(ch);
putc(ch,objectFile);
}
}
}
int main()
{
FILE* sourceFile,* objectFile;//源文件,目标文件
char sourceName[20],objectName[20];//源文件名,目标文件名
gets(sourceName);
gets(objectName);
sourceFile = fopen(sourceName,"r");
objectFile = fopen(objectName,"w");
commentFilter(sourceFile,objectFile);
return 0;
}
#include <stdio.h>
//删除注释
void commentFilter(FILE* sourceFile,FILE* objectFile)
{
char ch;
int flag=1;
bool read = true; //是否可读取,默认为可以
fseek(sourceFile,0,SEEK_END); //定位
int len = (int)ftell(sourceFile); //获得文件总字符长度
//逐个读取文件中的字符
for(int cursor=0;cursor<len;cursor++)
{
fseek(sourceFile,cursor,SEEK_SET);
ch = getc(sourceFile);
switch(ch)
{
//如果遇到双引号,则先将双引号之间的字符写入目标文件
case '"':
{
if(read) //不是在注释行之内
{
putc(ch,objectFile);//写入目标文件
putchar(ch); //输出到控制台
++cursor;
fseek(sourceFile,cursor,SEEK_SET);
char c = getc(sourceFile);
for(;c != '"';)
{
putc(c,objectFile);
putchar(c);
cursor++;
fseek(sourceFile,cursor,SEEK_SET);
c = getc(sourceFile);
}
break;
}
else
break;
}
case '/' :
{
if(read)
{
++cursor;
fseek(sourceFile,cursor,SEEK_SET); //定位到下一个字符,判断是否依然为'/'或'*'
char c = getc(sourceFile);
if(c == '/'){read=false;flag=1;break;}//flag=1,表示遇到的是以//开头的注释
if(c == '*'){read=false;flag=2;break;}//flag=2,表示遇到的是以/*开头的注释
else {--cursor;break;}
}
else
break;
}
case '*' :
{
if(!read) //之前是注释行
{
++cursor;
fseek(sourceFile,cursor,SEEK_SET);
char c = getc(sourceFile);
if(c == '/' && flag == 2)//下一个是'/'且为第二种注释
{
++cursor;
fseek(sourceFile,cursor,SEEK_SET);
ch = getc(sourceFile);
read = true;
}
else
{--cursor;break;}
}
else
break;
}
case '\n' :
{
if(!read && flag!=2)
read = true;
//判断下一行是否为空行,如果是则直接忽略
++cursor;
fseek(sourceFile,cursor,SEEK_SET);
char c = getc(sourceFile);
if(c != '\n') //不是则将cursor还原
--cursor;
break;
}
default:
break;
}
if(read) //将读取到的字符写入目标文件及输出到控制台
{
putchar(ch);
putc(ch,objectFile);
}
}
}
int main()
{
FILE* sourceFile,* objectFile;//源文件,目标文件
char sourceName[20],objectName[20];//源文件名,目标文件名
gets(sourceName);
gets(objectName);
sourceFile = fopen(sourceName,"r");
objectFile = fopen(objectName,"w");
commentFilter(sourceFile,objectFile);
return 0;
}