thejacoblu

C++_homework_EraseComment

顾名思义就是删除程序中的注释,不清楚fsm的机制,完全是自己的思路做。

开头先读取一个字符确定是否到文件结尾,如果读取成功,是换行的话就换行,并继续读取,不是的话,用putback放回缓冲区,并整行读取。

有两个状态开关(bool 0为关),相互制约,state开时,说明已经遇到/*,要遇到*/才会关闭,flag开时,说明遇到",再遇到"才会关闭接下来均是字符串内容,不用考虑注释。

state开时,posa表示/*的/的位置,如果一行结束也没有遇到*/,那么从/*开始删除到结束,并且将posa赋值0。下一行时同样操作。

 1 #include <iostream>
 2 #include <string>
 3 #include <fstream>
 4 using namespace std;
 5 
 6 int main(int argc,char* argv[])
 7 {
 8     ifstream fin;
 9     ofstream fout;
10     fin.open(argv[1]);
11     fout.open(argv[2]);
12     char c;
13     bool flag=0,state=0;
14     int posa=-1,posb=-1;
15     while(fin.get(c)){
16         if(c=='\n') fout<<endl;
17         else{
18             fin.putback(c);
19             string ss;
20             getline(fin,ss);
21 
22             for(int i=0;i<ss.size();i++){
23                 if(state==false){
24                     if(ss[i]=='"'){
25                         if(flag==0) flag=true;
26                         else flag=false;
27                     }
28 
29                     if(flag==0&&ss[i]=='/'){
30                         if(ss[i+1]=='/')
31                             ss.erase(i,ss.size()-i);
32                         if(state==false&&ss[i+1]=='*'){
33                             posa=i;
34                             state=true;
35                         }
36                     }
37 
38                 }
39                 if(state==true&&ss[i]=='*'){
40                     if(ss[i+1]=='/'){
41                         posb=i+1;
42                         state=false;
43                     }
44                 }
45             }
46 
47             if(state==true){
48                 ss.erase(posa,ss.size()-posa);
49                 posa=0;
50             }
51             else if(state==false&&ss.size()&&posa!=-1){
52                 ss.erase(posa,posb-posa+1);
53                 posa=posb=-1;
54             }
55 
56             fout<<ss<<endl;
57         }
58 
59     }
60     fout.close();
61     fin.close();
62     return 0;
63 }

关于文件操作和Ubuntu常用命令和argc&argv的问题,(可能会)另开一篇讲。

posted @ 2018-03-28 23:24  thejacoblu  阅读(172)  评论(0编辑  收藏  举报