zoukankan      html  css  js  c++  java
  • 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=='
    ') 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的问题,(可能会)另开一篇讲。

  • 相关阅读:
    WEB 应用缓存解析以及使用 Redis 实现分布式缓存
    MVC 架构模式
    用两个栈实现队列
    重建二叉树
    从尾到头打印链表
    替换空格
    二维数组中的查找
    二叉树与线索二叉树
    OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践
    开放下载!解锁 Serverless 从入门到实战大“橙”就
  • 原文地址:https://www.cnblogs.com/Jiiiin/p/8667137.html
Copyright © 2011-2022 走看看