我正在寻找一种方法来使用C ++替换我的html文件的某个字符串(不是整行)。例如,如果我有一个包含以下内容的html文件:
</span><br><span class=text>morning<br></span></td>
我希望它编辑为:
</span><br><span class=text>night<br></span></td>
我需要更换&#34;早上&#34; by&#34; night&#34;,这是我的代码:
string strReplace = "morning";
string strNew = "night";
ifstream filein("old_file.html");
ofstream fileout("new_file.html");
string strTemp;
while(filein >> strTemp)
{
if(strTemp == strReplace){
strTemp = strNew;
}
strTemp += "\n";
fileout << strTemp;
}
此代码对我的文件没有任何影响,我猜原因是它只能更改整行,而不是部分字符串。有人可以给我一些建议来做正确的实施吗?提前谢谢。
答案 0 :(得分:1)
您可以获取整行,然后搜索并替换子字符串。这样,您甚至可以跳过整个循环:
std::string line;
//Get line in 'filein'
std::getline(filein, line);
std::string replace = "morning";
//Find 'replace'
std::size_t pos = line.find(replace);
//If it found 'replace', replace it with "night"
if (pos != std::string::npos)
line.replace(pos, replace.length(), "night");
答案 1 :(得分:0)
从我阅读原始问题的方式来看,您需要将文件中“morning”的所有实例替换为“night”,而不仅仅是给定行上的一个实例。我首先将整个文件读成一个字符串。
std::string getfile(std::ifstream& is) {
std::string contents;
// Here is one way to read the whole file
for (char ch; is.get(ch); contents.push_back(ch)) {}
}
接下来,创建一个find_and_replace函数:
void find_and_replace(std::string& file_contents,
const std::string& morn, const std::string& night) {
// This searches the file for the first occurence of the morn string.
auto pos = file_contents.find(morn);
while (pos != std::string::npos) {
file_contents.replace(pos, morn.length(), night);
// Continue searching from here.
pos = file_contents.find(morn, pos);
}
}
然后在main中,
std::string contents = getfile(filein);
find_and_replace(contents, "morning", "night");
fileout << contents;
编辑:find_and_replace()不应将其file_contents字符串参数声明为const。刚注意到并解决了这个问题。
答案 2 :(得分:0)
您可以通过多种方式处理它。一个非常常见的做法是创建一个包含新字符串的文件,删除旧文件,然后将新文件重命名为旧文件名。
如果这适合你,你可以抓住这个控制台应用程序。
参数1是要搜索的字符串
参数2是要使用的替换文本
参数3是文件路径
基本上,我正在为新文件制作一些STD流,并从旧文件中查找有问题的字符串(如果存在),如果存在,则替换该字符串,然后管道结果,无论是否替换发生在新文件的新行上。
然后,我们关闭流,检查文件大小,如果它成功创建非空文件,我们将删除旧文件并将新文件重命名为旧文件名
如果退出代码aka errorlevel为2,则表示输入流不起作用。如果它为-1,那意味着我们没有成功找到并替换为新文件。如果它是1,那意味着您没有提供正确的参数。只有零退出表示成功。
如果您想使用它,您应该添加一些异常处理,并且可能是一个更强大的文件备份解决方案。
#include <iostream>
#include <fstream>
#include <string>
#include <sys\stat.h>
using namespace std;
int main(int argc, char * argv[])
{
if (argc != 4) { return 1; }
int exit_code = -1;
string textToFind = string(argv[1]);
string replacementText = string(argv[2]);
string fileToParse = string(argv[3]);
string fileToWrite = fileToParse+".rep";
ifstream inputFileStream(fileToParse, ifstream::in);
if (!inputFileStream.good()) { return 2; }
ofstream outputFileStream(fileToWrite);
string fileLine;
while (getline(inputFileStream, fileLine))
{
size_t substringPos = fileLine.find(textToFind);
if (substringPos != string::npos)
{
fileLine.replace(substringPos, textToFind.size(), replacementText);
}
outputFileStream << fileLine << '\n';
}
outputFileStream.close();
inputFileStream.close();
struct stat st;
stat(fileToWrite.c_str(), &st);
int new_file_size = st.st_size;
if (new_file_size > 0)
{
if (remove(fileToParse.c_str())==0)
{
if (rename(fileToWrite.c_str(), fileToParse.c_str())==0)
{
exit_code = 0;
}
}
}
return exit_code;
}