删除文件中的注释:将C语言源程序文件中的内容分语句和注释两部分,语句(去除空行后)显示在屏幕上,注释存放到文本文件中

这是一道文件操作初应用的题目:

首先我们可以直接的看到该题目中代码需要我们分几种情况去做出不一样的操作。

如果有/,则分为3种情况

1://连在一起。

2./*连在一起。

3.单就一个/。

对于第二种情况还得细分,因为*后面的代码可能是/也可能不是/。

如果没有/,则打印在屏幕上。

 故情况如图:

 

#include<stdio.h>
int main()
{
	FILE*p1=fopen("hello.c","r");//打开hello.c文件并只读 
	FILE*p2=fopen("comment.txt","w");//打开comment.txt文件并只写 
	char g;
	if(p1==NULL)//检测文件是否打开成功 
	{
		  printf("hello.c文件打开失败\n"); 
	 } 
	 if(p2==NULL)//检测文件是否打开成功 
	 {
		 printf("hello.c文件打开失败\n");
	 } 
	while(!feof(p1))//检测文件是否到结尾 
	{
		g=fgetc(p1);
		if(g=='/')//如果遇到/字符 
		{
			g=fgetc(p1);
			if(g=='/')//情况1://连在一起,则后面整句读入conment.txt 
			{
				while((g=fgetc(p1))!='\n')
				{
					fputc(g,p2);//写入文件comment.txt 
				}
				fputc(g,p2);//把换行符也写进去 
				if((g=fgetc(p1))!='/')//由于题目要求后面几句//整句存完之后要在stdout上打印出空格而第一句却不用故想用这种方法来进行一个判断 
				{
					printf("\n");
					}
					fseek(p1,-1,SEEK_CUR);//文件指针标识回退	
				continue;
				
			}
			else
			{
				if(g=='*')//情况2:/*类型则需要找到下一个*/才行 
				{
				 while((g=fgetc(p1))!='*')//找到* 
				 {
				 	fputc(g,p2);
				 }
				 g=fgetc(p1);
				 if(g=='/')//判断是否为*/ 
				 {
				 	fputc('\n',p2);//是的话就完成一段/**/的写入文件操作了 
				 	continue;
				 }
				 else
				 {
				 	fseek(p1,-1,SEEK_CUR);//如果*下一个字符并不是/则需要使文件指针回退 
				 	fputc('*',p2);
				 	while((g=fgetc(p1))!='*')//死方法,只能适用于本题 
				 	{
				 		fputc(g,p2);
					 }
					 fseek(p1,1L,SEEK_CUR);
					 g=fgetc(p1);
					 fputc(g,p2);
					 
					 continue;

				 	
				 }
				}
				else//情况3:代码中有/字符而不需要做处理的情况 
				{
					fseek(p1,-2,SEEK_CUR);//回退并读入即可 
					g=fgetc(p1);
					printf("%c",g);
					continue;
				}
			}
		
		} 
		else//无/则打印在stdout上即可 
		{
				printf("%c",g);
				if(g=='}')//判断是否是最后一句代码,由于题目最后一句代码不需要再多打印一个换行,故进行该操作 
				return 0;	
		}
	}
	fclose(p1);
	fclose(p2);
}

这是我一开始写的代码,虽然思路很麻烦,但总算提交是满分了,但是我这个做法的话只能针对这一道题,如果在/*中有多个*那么这个代码就实现不了所需要的功能了,如果要用于更多情况的话就得将/*这种情况中代码做修改。

修改后代码如下/*与*/直接的*问题得以解决,但其他还是比较固定,暂时没有想出别的方法。

#include<stdio.h>
int main()
{
	FILE*p1=fopen("hello.c","r");//打开hello.c文件并只读 
	FILE*p2=fopen("comment.txt","w");//打开comment.txt文件并只写 
	char g;
	if(p1==NULL)//检测文件是否打开成功 
	{
		  printf("hello.c文件打开失败\n"); 
	 } 
	 if(p2==NULL)//检测文件是否打开成功 
	 {
		 printf("hello.c文件打开失败\n");
	 } 
	while(!feof(p1))//检测文件是否到结尾 
	{
		g=fgetc(p1);
		if(g=='/')//如果遇到/字符 
		{
			g=fgetc(p1);
			if(g=='/')//情况1://连在一起,则后面整句读入conment.txt 
			{
				while((g=fgetc(p1))!='\n')
				{
					fputc(g,p2);//写入文件comment.txt 
				}
				fputc(g,p2);//把换行符也写进去 
				if((g=fgetc(p1))!='/')//由于题目要求后面几句//整句存完之后要在stdout上打印出空格而第一句却不用故想用这种方法来进行一个判断 
				{
					printf("\n");
					}
					fseek(p1,-1,SEEK_CUR);//文件指针标识回退	
				continue;
				
			}
			else
			{
				if(g=='*')//情况2:/*类型则需要找到下一个*/才行 
				{
				 while(1)
				 {
				 	g=fgetc(p1);
				 	if(g=='*')//有颗星 
				 	{
				 		g=fgetc(p1);
				 		if(g=='/')
				 		{
				 			g=fgetc(p1);
				 			g=fgetc(p1);//判断是否是进入#include那段 
				 			if(g!='#')
				 			{
				 				fseek(p1,-2,SEEK_CUR);
							 }
							 else
							 {
							 }
							 fputc('\n',p2);

				 			break;
						 }
						 else//但*后面并不是/ 
						 {
						 	fputc('*',p2);//把星还了 
						 	fseek(p1,-1,SEEK_CUR);
						 	continue;
						 }
					 }
					 else
					 {
					 	fputc(g,p2);
					 }
				  } 
				}
				else//情况3:代码中有/字符而不需要做处理的情况 
				{
					fseek(p1,-2,SEEK_CUR);//回退并读入即可 
					g=fgetc(p1);
					printf("%c",g);
					continue;
				}
			}
		
		} 
		else//无/则打印在stdout上即可 
		{
				printf("%c",g);
				if(g=='}')//判断是否是最后一句代码,由于题目最后一句代码不需要再多打印一个换行,故进行该操作 
				return 0;	
		}
	}
	fclose(p1);
	fclose(p2);
}

 

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值