标签:value 参数 冒号 状态 函数 第三版 个数 遍历 使用
字符流的概念,我就不介绍了。网上很多。
我就由浅到深的介绍一下我的思路吧!
思考的问题:
第一个:如何新建一个同类型的文件,且源文件不破坏,消除注释后的文件保存在旁边?
第二个:如何获取它的名字?
第三个:如何适应于.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的长度。
代码不上传了。思路,完全上传。
注:这个题目,是在我形式语言中的一次作业,写出来的。也许用例不够全部,请见谅!
标签:value 参数 冒号 状态 函数 第三版 个数 遍历 使用
原文地址:https://www.cnblogs.com/new-zjw/p/8973660.html