2014-12-01 5 views
0

Я пытаюсь создать программу, которая находит несколько строк в файле, которые постоянно имеют // и заменяют их /* * * */. Но одиночные строки с // остались как есть. Следующий примерный код дает хорошее представление о том, что я пытаюсь выполнить.Поиск и замена строк из файла cpp

Пример-original.cpp

#include <iostream> 
using namespace std; 

//to be replaced 
//to be replaced 
//to be replaced 
//to be replaced 

BLAH BLAH BLAH 
... 
... 
int main() 
{ 
... 
... 
//to be replaced 
//to be replaced 
} 
//to be left as it is 
return 0; 
} 

Wantedoutput.cpp

#include <iostream> 
using namespace std; 

/* replaced 
    *replaced 
    *replaced 
    *replaced 
    */ 

BLAH BLAH BLAH 
... 
... 
int main() 
{ 
... 
... 
/*replaced 
    *replaced 
    */ 
} 
//to be left as it is 
return 0; 
} 

Я создал программу, которая успешно меняет первый раз происходят комментарии многострочный, но он не работает для других комментариев с несколькими строками, которые следуют за ними. Выход сохраняется в «xyz.tmp». Файл, который нужно изменить, предоставляется как аргумент командной строки. Во-первых, я получил номера строк, которые содержат // и сохранили его в массиве.

В примере мой массив будет `startcom [] = {4,7,16,17} '. В этом массиве хранится номер строки первой и последней строк нескольких строк. Надеюсь, это поможет понять код.

Затем я использую этот массив, чтобы проверить, содержит ли он последовательные значения. Наконец, я снова прочитал файл и проверил, совпадает ли он со значениями в этом массиве. Я попробовал отладку, распечатав содержимое каждой строки до того, как она будет записана в файл temp. Он показывает, что строка была заменена, но в выходном файле она не показывает никаких изменений. Было бы здорово, если бы кто-нибудь мог понять, почему код не работает для других экземпляров нескольких строк комментариев.

mycode.cpp

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 
#include <vector> 
#include <sys/stat.h> 
using namespace std; 

bool replace(std::string& str, const std::string& from, const std::string& to) { 
size_t start_pos = str.find(from); 
//cout << "within function " << "string is " << str << "from position, to position " << from << "," << to << '\n'; 
if(start_pos == std::string::npos) 
    return false; 
str.replace(start_pos, from.length(), to); 
return true; 
} 



int main (int argc, char* argv[]) 
{ 
string line; 
int linecount=0, linearray[1000],temp=0; 
std::vector<int> startcom, endcom; 
ofstream TempFile ("xyz.tmp"); 

ifstream myfile (argv[1]); 
if (myfile.is_open()) 
{ 
    while (getline (myfile,line)) 
    { 
     linecount++; 
     if (line.find("//") != std::string::npos) 
     { 
      linearray[temp]=linecount; 
      temp++; 
      cout << "linecount->" <<linecount << "comment line" << line << '\n'; 
     } 
    } 
myfile.close(); 
} 
else 
{ 
    cout << "Unable to open file"; 
} 
for(int k=0;k<temp;k++) 
cout << "array elements are: " << linearray[k] << '\n'; 
cout << "size of temp is: " <<temp << '\n'; 
for(int i=0;i<temp;i++) 
{ 
    int j=0; 
    cout << "for loop " << i << " element is "<< linearray[i] <<'\n'; 
    if((linearray[i]+1) == linearray[i+1]) 
    { 
     startcom.push_back(i); 
     cout << "outer if part" << '\n'; 
     for(j=i+1; j < 10; j++) 
     { 
        if((linearray[j]+1) == linearray[j+1]) 
        { 
         cout << "still continuing" << "j value " << j << '\n'; 
        } 
        else 
        { 
         startcom.push_back(j); 
         i=j; 
         cout << " inner else part for line " << j << '\n'; 
        break; 
        } 
     } 
    cout << "possible multiple comment lines at line" << i << '\n'; 
    } 
    else 
    { 
     cout << "outer else part" << '\n'; 
    } 
cout << "array element " << linearray[i] << '\n'; 
} 
//for listing out elements of startcom,endcom arrays 
cout << "startcom value " << '\n'; 
for (std::vector<int>::iterator it = startcom.begin(); it != startcom.end(); ++it) 
std::cout << ' ' << *it; 
cout << "startcom size is" << startcom.size() << "\n"; 
linecount=0; 
int tmpcount=0,a=0,b=0; 
ifstream myfile1 (argv[1]); 
for(tmpcount=0;tmpcount<startcom.size();tmpcount++) 
{ 
if (myfile1.is_open()) 
{ 
    while (getline (myfile1,line)) 
    { 
     linecount++; 
     a=startcom.at(tmpcount); 
     b=startcom.at(tmpcount+1); 
     if (linecount == linearray[a] && a!= b) 
     { 
      cout << "before replacing (startcom) ---> " << "at line -->" << linecount << line << '\n'; 

      replace(line, "//", "/*"); 
      TempFile << line << '\n'; 
      //while(replace(line, "//", "/*")) 
      //{ 
      // cout << " success repace " << '\n'; 
      //} 
      //linearray[temp]=linecount; 
      //temp++; 
      //cout << "linecount->" <<linecount << "this line contains //" << line << '\n'; 
      cout << "this line has been replaced ---> " << line << '\n'; 
     } 

     else if (linecount == linearray[b] && a!= b) 
     { 
      cout << "before replacing (endcom) ---> " << "at line -->" << linecount << line << '\n'; 
      replace(line, "//", " *"); 
      TempFile << line << '\n'; 
      TempFile << "*/" << '\n'; 
      cout << "this line has been replaced ---> " << line << '\n'; 
     } 
     else if (linecount > linearray[a] && linecount < linearray[b] && a!= b) 
     { 
      cout << "before replacing (start to end) ---> " << "at line -->" << linecount << line << '\n'; 
      replace(line, "//", " *"); 
      TempFile << line << '\n'; 
      cout << "this line has been replaced ---> " << line << '\n'; 
     } 
     else 
     { 
      cout << "No replacement " << "at line -->" << linecount << "\n" ; 
      TempFile << line << '\n'; 
     } 
    } 
myfile1.close(); 
TempFile.close(); 
} 
else 
{ 
    cout << "Unable to open file" << '\n'; 
} 

} 

return 0; 
} 

ответ

1

То, что вы пытаетесь сделать, это постоянно форматировать Ваш код. Рассмотрите http://uncrustify.sourceforge.net/, его мой любимый инструмент.

У него есть поддержка для объединения последовательных комментариев.

+1

cmt_cpp_nl_end = true - в соответствии с вашим точным запросом. –

+0

вариант, который вы указали, - это добавить новую строку перед закрывающим '* /' комбинированного комментария cpp. Но параметр, который мне нужен, меняет '//' на '/ *'. Я не могу найти вариант для этой функции. – Ravi

+0

У вас есть возможность изменить свои комментарии !!! Это 'cmt_cpp_to_c = true'. Спасибо, что указали этот инструмент. – Ravi

Смежные вопросы