字符流如何处理注释问题

字符流的概念,我就不介绍了。网上很多。

我就由浅到深的介绍一下我的思路吧!

思考的问题:

第一个:如何新建一个同类型的文件,且源文件不破坏,消除注释后的文件保存在旁边?

第二个:如何获取它的名字?

第三个:如何适应于.txt,.cpp,.c,.java,都适应呢?

第四个:如何去掉注释?

解决思路:

第一个:如何新建一个同类型的文件,且源文件不破坏,消除注释后的文件保存在旁边?

 在每一个文件里面,你所看见的一切,其实都是二进制表示,在此你的文件可以分为“二进制文件”,进一步的“ASCLL文件”!

在网上,我看见了好多的字符流处理,但是大部分都是由一个指定文件到另外一个指定文件,为什么这么说呢?

贴一个部分代码:

 fp1 = fopen("world.txt","w"); 
 fp2 = fopen("Hello.txt","r");

这样的代码,就是太死了。

那么如何我想要去掉哪个文件注释,就去掉哪个注释文件呢?并且他那个文件的旁边,新建一个同类型文件保存,为消除注释后的文件呢?

字符流新建文件的办法:

 FILE *fp1 = fopen(pre,"wb+"); //这个文件为二进制文件,w+,为ASCLL文件,详细见p299(c语言程序设计第三版)

解释:就是新建了一个文件,文件名字为pre,per包括了后缀名,wb+,新建二进制文件。

第二个:如何获取它的名字?

在我们的main()函数里面,其实我们是可以加两个参数的。一个是agrc,一个就是agrv[],具体形式为下面代码:

int main(int agrc,char *agrv[])

解释:

   agrc,代表着当你运行该文件的.exe,文件的时候,后面跟的注释文件的个数,范围为0到agrc-1,第0个代表着该文件的.exe文件,所以从1开始,消除注释!

   agrv,代表着每一个注释文件的名字,比如agrv[1],第一个注释文件的名字。

第三个:如何适应于.txt,.cpp,.c,.java,都适应呢?

其实当你获得名字的时候,你就可以判断,末尾是不是.txt,.cpp.,.c,.java。

用一个strcmp();函数判断,就解决掉了。

第四个:如何去掉注释?

我认为有优先级的。

    优先级最高的就是冒号,单引号.

    因为我们处理的只不过是去注释,所以如果为这个情况:“/**/”  OR “/**/等等。虽然有错误,但是我们负责的只是去注释的情况。那怕一行第一个为冒号,或者单引号,在这一行中后面没有另一个了,我们也不能去掉,因为这个是报错的情况,而我们负责的只是去注释。

   处理办法就是用一个标记flag去,标记是不是进入了该种状态,从而去处理。

   第一种情况,后面有另一半的,我们就到另一半结束。

   第二种情况,后面没有另一半的,我们就到'\n'结束,代表着该行判断完毕。

坑点就是:"//abc\"//def"//ghk,删除之后为"//abc\"//def"。原因就是\",会导致"不会和前面的结合,从而要继续寻找。

    优先级第二的情况就是/**/

   这个情况的话,我们可以用一个flag标记是不是进入了这种情况,一个pre表示前面一个字符,一个post表示后面一个字符。当pre=='/' && post == '*'的时候,flag = 1,表示进入了这个情况。

     优先级第三个的情况就是//

    这个情况的话,我们也可以一个pre表示前面一个字符,一个post表示后面一个字符。当pre=='/' && post == '/'的时候。我们用一个while去处理,到'\n',结束。

     

     后来的存起来就可以了。坑点就是第一个'\'的时候,我们保存起来。不存在fp2中去,判断后面post字符是不是'/',不是就存起来pre的,之后pre = post;

还有一个注意点就是初始化pre的时候,我是初始化pre = ‘\0’,保存的时候,切记一点就是如果pre=='\0'的话,就不要存入。

所以在存入的判断一下:

if(pre != '\0')  fprint(fp2,"%c",pre);

最大的坑点or最容易忽略的问题所在:

每一次指针遍历完了之后,如果你还想再次遍历这个文件的话,就需要将指针指向文件的开头。
使用的函数为fseek();

遇到的问题,上面都解决了。下面介绍一下,用到的函数:

strcat(post,pre);
将pre连接在post后面,注意空间大小
fprintf(fp2,"%c",post);
第一个参数表示文件指针,第二个表示类型,可以"%c%c",pre,post的,post就是紧接着的字符
feof(fp);
如果fp文件指针指向为空,返回true
fseek(fp,value2,value1);
fp表示文件指针,
value1=0的时候,表示文件开头,value2表示离文件开始的长度,
value1=1的时候,表示向后面离value2的长度。
value1=2的时候,表示是文件的末尾,value2,表示离文件末尾的距离。

代码不上传了。思路,完全上传。

注:这个题目,是在我形式语言中的一次作业,写出来的。也许用例不够全部,请见谅!

猜你喜欢

转载自www.cnblogs.com/new-zjw/p/8973660.html