1 //功能: 2 //去掉指定cpp源文件中的注释 3 4 //思路: 5 //与一cpp源文件建立关联 6 //以字符形式打开 7 //依次检测它的每一个字符,直到遇到eof(文件结束符) 8 //如果遇到'/',如果它的下一个字符也为'/',则说明从这里开始是注释,所以删掉从这一行从此处以后的所有字符 9 10 //总结: 11 //1、一开始把while中的infile.get(c)写成infile>>c,以至于输出的ex(2).cpp文件中所有代码都写到了一行,而且没有空格。 12 //原因是用类似于“cin>>”的方式“infile>>”读入是忽略空格和回车的。 13 //2、学会到peek()的用法,文件流输入输出里面也有peek(),观察当前字符的下一个字符是什么,而不改变当前指针的位置,不管peek多少次都一样。 14 //3、学到用c++程序删除文件的方法,添加windows.h头文件,然后调用DeleteFileA(path)函数(path可以是一个字符串变量也可以是一个字符串常量)删除path指定路径的文件。 15 16 //改进方案: 17 //只能作用于指定目录指定名字的文件(当前目录下的ex.cpp文件),而且没有图形界面。 18 //下一步做出一个图形界面来,并且可以转换任意cpp文件。 19 #include <fstream> 20 #include <iostream> 21 #include <stdlib.h> 22 #include <windows.h> 23 using namespace std; 24 25 int main() 26 { 27 char c; 28 ifstream infile("ex.cpp",ios::in); //与ex.cpp源文件建立关联,方式是输入。 29 ofstream outfile("ex_temp.cpp",ios::out); 30 if((!infile)||(!outfile)){ //如果打开失败,提示,退出程序。 31 cerr<<"open error!"<<endl; 32 exit(1); 33 } 34 while(infile.get(c)){ //依次读入字符,直到检测到eof 35 if(c=='/'){ //如果当前字符为'/' 36 if((c=infile.get())=='/'){ //如果'/'的下一个字符还是'/',则说明这里开始是注释。 37 //开始删掉这一行以后的所有字符。 38 while((c=infile.get())!='\n'); 39 outfile<<c; //输出c的值,即一个回车,本行结束。 40 } 41 else if(c=='*'){ //如果'/'的下一个字符是'*',则说明这里开始是段注释 42 while((c=infile.get())!='*'){ 43 if((c=infile.peek())=='/'){ 44 break; 45 } 46 } 47 } 48 else{ //如果第二个字符既不是'/',也不是'*',说明还不是注释,输出上一个字符'/',以及当前字符。 49 outfile<<'/'<<c; 50 } 51 } 52 else{ //如果当前字符不是'/',原样写入。 53 outfile<<c; 54 } 55 } 56 infile.close(); 57 outfile.close(); 58 59 //去掉文件开头的空行 60 ifstream infile2("ex_temp.cpp",ios::in); 61 ofstream outfile2("ex_res.cpp",ios::out); 62 if((!infile2)||(!outfile)){ 63 cerr<<"open error!"<<endl; 64 exit(1); 65 } 66 while(infile2.get(c)){ 67 if(c!=' ' && c!='\n') 68 break; 69 } 70 do{ 71 outfile2.put(c); 72 }while(infile2.get(c)); 73 infile2.close(); 74 outfile2.close(); 75 76 DeleteFileA("ex_temp.cpp"); //删掉中间文件 77 cout<<"去注释成功!请按回车结束!"; 78 getchar(); 79 return 0; 80 }