我正在尝试找到一种方法来替换包含字符串的行,并在一个新行的文件中。
如果文件中不存在该字符串,则将其附加到文件中。
有人可以提供示例代码吗?
编辑:无论如何,如果我需要替换的行位于文件的末尾?
答案 0 :(得分:2)
虽然我认识到这不是最聪明的方法,但以下代码逐行读取 demo.txt 并搜索单词 cactus 以替换它将输出写入名为 result.txt 的辅助文件时, oranges 。
别担心,我为你节省了一些工作。阅读评论:
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string search_string = "cactus";
string replace_string = "oranges";
string inbuf;
fstream input_file("demo.txt", ios::in);
ofstream output_file("result.txt");
while (!input_file.eof())
{
getline(input_file, inbuf);
int spot = inbuf.find(search_string);
if(spot >= 0)
{
string tmpstring = inbuf.substr(0,spot);
tmpstring += replace_string;
tmpstring += inbuf.substr(spot+search_string.length(), inbuf.length());
inbuf = tmpstring;
}
output_file << inbuf << endl;
}
//TODO: delete demo.txt and rename result.txt to demo.txt
// to achieve the REPLACE effect.
}
答案 1 :(得分:1)
要替换文件中的最后两行:
fopen()
打开文件fgetpos()
fseek()
fprintf()
将新行添加到文件中,然后使用fclose()
将其关闭。答案 2 :(得分:1)
如上所述,KarlPhilip的代码是一个很好的起点(谢谢),但根据“&gt; = 0”无法正常工作。与“0”相比,MS CString类型和C#等已知,但似乎与STL无法正常工作。例如。在VS 2010(仅发布)中,C ++代码在这种比较中表现错误而没有抛出错误!
以下是对C ++标准的更正:如果某些向导有改进,请发布它们。我认为,这是一个非常有用和重要的问题/片段。
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string search_string = "cactus";
string replace_string = "oranges";
string inbuf;
// Todo: Check, if input_file exists before.
// Todo: Try/catch or check, if you have write access to the output file.
fstream input_file("demo.txt", ios::in);
ofstream output_file("result.txt");
while (!input_file.eof())
{
getline(input_file, inbuf);
size_t foundpos = inbuf.find(search_string);
if(foundpos != std::string::npos)
{
string tmpstring = inbuf.substr(0,spot);
tmpstring += replace_string;
tmpstring += inbuf.substr(spot+search_string.length(), inbuf.length());
inbuf = tmpstring;
}
output_file << inbuf << endl;
}
//TODO: delete demo.txt and rename result.txt to demo.txt
// to achieve the REPLACE effect.
}
我在另一个SO问题的“if”中使用了以下替换部分 (上面的代码只替换第一次出现):
if(foundpos != std::string::npos)
replaceAll(inbuf, search_string, replace_string);
//http://stackoverflow.com/questions/3418231/c-replace-part-of-a-string-with-another-string
//
void replaceAll(std::string& str, const std::string& from, const std::string& to)
{
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos)
{
size_t end_pos = start_pos + from.length();
str.replace(start_pos, end_pos, to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}
}
答案 3 :(得分:0)
如果要更改(或删除)文件中间一行的长度,则必须重新编写所有后续行。
无法简单地将字符删除或插入现有文件中。