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的问题,(可能会)另开一篇讲。