删除C文件中的注释

删除C文件中的注释

今天是C语言课后的一道题目,感受比较有趣,刚开始一直没有相通,花了很长时间,后来想到了一种解决办法,在这里分享一下,有其余办法的也可在评论区留言你们交流。web

题目描述

删除文件中的注释:将C语言源程序(hello.c)文件中的全部注释去掉后存入另外一个文件(new_hello.c)svg

问题分析

注释有两种,多行注释(“/* /”)和单行注释(“// ”)。
解决思路以下:
逐个对文件一中的字符进行分析,遇到字符’/‘进入下一步分析,不然直接将该字符存入文件二中。
当前一个字符为’/’,第二个字符可分为三种状况,
①第二个字符为’/’,则此时注释符为单行注释,此时文件一中该行剩余的字符都将再也不输入文件二,直到遇到换行符结束循环。
②第二个字符为’
’,则此时注释符为多行注释,这种状况下,须要找到“/”,直到“/”以前的字符都将再也不输出到文件二。这种状况下我想了很长时间如何实现,个人解决办法是,读到’'后将使用fgets函数每次读入两个字符,使用strstr函数判断读入的字符是否为“/”,如果则退出循环,不然将文件指针后移一位,而后接着读入两个字符进行判断(主要是为了防止“**/”的状况)。
③第二个字符是其余字符,此时第一个字符不构成注释符,使用fseek函数将文件指针后移两位,从新读写‘/’ 。函数

程序运行效果

删除文件注释

程序源代码

/*将原文件中的注释删除后存储到另外一个文件中*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
	FILE *fp1, *fp2;
	char ch;
	char comment[2];
	/*打开读出数据的文件*/ 
	if((fp1 = fopen("F:\\201801\\C语言\\第十二次做业\\hello.c", "r")) == NULL)
	{
		printf("File open error!\n");
		exit(0);
	}
	/*打开写入数据的文件*/
	if((fp2 = fopen("F:\\201801\\C语言\\第十二次做业\\new_hello.c", "w")) == NULL)
	{
		printf("File open error!\n");
		exit(0);
	}	 
	/*对文件1中的字符进行处理*/
	while(!feof(fp1)){
		ch = fgetc(fp1);
		if(ch == EOF)
			continue;
		if(ch == '/'){
			ch = fgetc(fp1);
			//单行注释 ,遇到换行符结束,结束后需输出换行符 
			if(ch == '/'){
				while(ch != '\n' && ch != EOF){
					ch = fgetc(fp1);
				}
				fputc('\n',fp2);
			}
			/*跨行注释,遇到结束符结束,每次读入两个字符进行比较,若不是则退回一个字符,继续比较*/ 
			else if(ch == '*'){
				fgets(comment, 3, fp1);
				while(strstr(comment, "*/")==NULL){
					fseek(fp1, -1L, SEEK_CUR);
					fgets(comment, 3, fp1);
				}				
			}
			//不是注释符,只是单纯的'/'符号,则退回两个字符,读写'/' 
			else{
				fseek(fp1, -2L, SEEK_CUR);
				ch = fgetc(fp1);
				fputc(ch, fp2);
			}			
		}
		else{
			fputc(ch,fp2);
		}		
		
	} 	 
	//关闭文件
	if(fclose(fp1)){
		printf("Can not close the file! \n");
		exit(0);
	} 
	//关闭文件
	if(fclose(fp2)){
		printf("Can not close the file! \n");
		exit(0);
	} 
	printf("处理结束\n");
	return 0;
}