Я пытаюсь создать программу, которая находит несколько строк в файле, который постоянно имеет //
и заменяет их /* * * */
. Но одиночные строки с //
оставлены как есть. Следующий примерный код дает хорошее представление о том, что я пытаюсь выполнить.
Пример-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;
}
То, что вы пытаетесь сделать, - это постоянный формат вашего кода. Рассмотрим http://uncrustify.sourceforge.net/, свой любимый инструмент.
Он специально поддерживает объединение последовательных комментариев.
*/
комбинированного cpp-комментария. Но опция, которая мне нужна, меняется//
на/*
. Я не могу найти опцию для этой функции.