IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 编写程序删除C语言程序里的所有注释语句。正确处理带有引号的字符串和字符常量,注释不允许嵌套。(包含文件操作)(含详细解释) -> 正文阅读

[C++知识库]编写程序删除C语言程序里的所有注释语句。正确处理带有引号的字符串和字符常量,注释不允许嵌套。(包含文件操作)(含详细解释)

/*
分析:注释语句,有现在使用的这种多行注释,还有//这种单行注释,注意不能嵌套哈
      那么怎么实现呢,还要避免是带有引号的字符串和字符常量,我想到的是当遇到
	  了双引号或者单引号在遇到下一个之前都不管括号里是什么,假如没有在单双引号
	  里面,如果遇到了/就判断下一个是*还是/,若下一个是*就直接删除到下一个*和/
	  处,若是/,就删除到遇到换行符号,调用函数我觉得是最好用在这种判断里面的,很方便
	  这里我还用到了文件的相关操作。
*/

//开始前可以新建一个文本文档,用于之后的文件操作,不新建也可以,后续打开没有的话会自己创建
/*这里我是创建了一个文本文件然后用之前写的一个简单的C语言程序来测试,把他通过文件操作写入
  文本文件,然后编写程序对文本文件进行删除
*/
#include<stdio.h>
#include<stdlib.h>
char Fin1(FILE *fp1,FILE *fp2,char temp);
char Fin2(FILE *fp1,FILE *fp2,char temp);
int main()
{
	FILE *fp1,*fp2;   //文件指针
	fp1=fopen("继续.cpp","rb");     //打开两个文件,注意要使用fread这些函数要使用二进制打开文件,具体可以去翻翻书,都有写到的
	fp2=fopen("wenjian.txt","wb");     //继续.cpp就是当前我写的这个程序用来测试的,你们可以自己去写一个简单的,随便都行,wenjian.txt就是我新建的文本文件,注意位置最好在一个文件夹下面,否则你还需要去输入相应的地址,有点麻烦
	if(fp1==NULL||fp2==NULL)    //判断打开是否成功
	{
		printf("打开失败!!\n");
		exit(0);
	}
	char temp;           //定义一个中间变量
	fread(&temp,sizeof(char),1,fp1);  //这里我使用的是逐个字符写入到文本文件,还有其他方法,具体就自己多去探索
	                                  //这里括号里的意思就是从fp1中读取1个sizeof(char)字节的数据块到temp中
	while(!feof(fp1))
	{
		//这里我是想直接用条件判断然后将删除完的小c程序复制到文本文件,可以的话你们也可以自己再把删除后的文本文件的粘贴回去小c程序
		//接下来的可能看起来会有一点复杂,我尽量说明白,希望你们想看的也认真看

		//这里表示遇到了双引号或者单引号,也就是说是字符串常量或者是字符常量,我们就调用函数直接输出这一串
		if(temp=='\"'||temp=='\'')     
		{
			fwrite(&temp,sizeof(char),1,fp2);     
			temp=Fin1(fp1,fp2,temp);    
		}
		else if(temp=='/')     //到这里的话表示我们可能会遇到单行或者是多行注释,至于是不是我们需要接下来调用函数进行判断
		{
			temp=Fin2(fp1,fp2,temp);     //因为这里可能属于我们要删除的范围,所以先不写入文本文件,等到判断完毕之后再看要不要输入
		}
		else     //到这里就表示不属于任何一种我们要删除和判断的情况,直接输出读入就好
		{
		fwrite(&temp,sizeof(char),1,fp2);
		fread(&temp,sizeof(char),1,fp1);
		}

	}
	fclose(fp1);   //操作完成后关闭文件
	 fclose(fp2);  
	//可以去运行一下试试,运行完毕后点开你的文本文件看就会发现那个小c程序的内容全部都过滤删除了一下我们要删除的内容然后写入到了文本文件里面
	return 0;
}
char Fin1(FILE *fp1,FILE *fp2,char temp)     //这属于判断特殊情形,也就是字符串和字符常量,这里的文件指针跟我们平常的指针差不多,
                                         //也就是逐个去读取读入,位置发生变化,所以这里在判断时的读入写出就也相当于主程序里的读入写出,都发生变化
{
	char ton;     //定义一个中间变量
	fread(&ton,sizeof(char),1,fp1);     //给他读入一个然后去跟temp比较
	while(ton!=temp)     //一直比较到等于temp,因为是"",'',开始结束标志相同
	{
		fwrite(&ton,sizeof(char),1,fp2);     //一直读入写入
		fread(&ton,sizeof(char),1,fp1);
	}
	fwrite(&ton,sizeof(char),1,fp2);     //到这里表示这种特殊情况结束,但是不要忘记输入结束标志,也就是"或者',然后读入返回给temp
	fread(&ton,sizeof(char),1,fp1);
	return ton;
}
char Fin2(FILE *fp1,FILE *fp2,char temp)     //这里就是判断是不是要删除的注释
{
	char ton;
	fread(&ton,sizeof(char),1,fp1);     //也是先定义一个中间变量,然后从小c程序读入一个值给他
	if(ton=='/')     //假如ton是/表示他是单行注释,我们就需要在换行符之前一直读入,直到遇到换行符
	{
		while(ton!='\n')
		{
		    fread(&ton,sizeof(char),1,fp1);
		}
		fwrite(&ton,sizeof(char),1,fp2);     //注意换行符不要删除,要写入文本文件,虽然看不见,但是到时候写回去C语言程序就能看见了吧
		fread(&ton,sizeof(char),1,fp1);     //再读入一个返回给temp;
		return ton;
	}
	if(ton=='*')     //这表示是多行注释
	{
		while(!feof(fp1))     //一直到文件末尾我们都要判断
		{
			fread(&ton,sizeof(char),1,fp1);    //再读入一个给ton
			if(ton=='*')     //假如下一个是*
			{
				fread(&ton,sizeof(char),1,fp1);     //再读入一个
				if(ton=='/')     //假如下一个是/,表示多行注释结束
				{
					fread(&ton,sizeof(char),1,fp1);     //读入下一个给ton,返回给temp
					return ton;
				}
			}
			     //否则就一直读入判断不写入
		}
	}
	fwrite(&ton,sizeof(char),1,fp2);     //这里表示遇到的既不是单行注释也不是多行注释,直接写入然后读入一个给ton返回给temp
	fread(&ton,sizeof(char),1,fp1);
	return ton;
}

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:31:50  更:2021-12-01 17:33:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:54:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码