我正在尝试将文件复制到另一个文件,但是用用户输入的内容更改了一个单词。到目前为止,我已经想出了这个:
while (getline(openningTheFile, line, ' ')) //line is a string and openningTheFile is an ifstream
{
if (line == wordToBeDeleted)
{
line = wordToReplaceWith;
}
if (line == "\n")
{
newFile << endl; //newFile is an ofstream
}
newFile << line << " ";
}
但问题是此代码不会在"\n"
之后读取单词,因为分隔符是空格。
有人能指出我正确的方向吗?
答案 0 :(得分:3)
策略我建议:
std::getline
逐行阅读文件。std::string::find
查找要在该行中替换的字符串。以下是核心代码:
while (getline(openningTheFile, line))
{
std::string::size_type pos;
while ( (pos = line.find(wordToBeDeleted)) != std::string::npos )
{
line.replace(pos, wordToBeDeleted.length(), wordToReplaceWith);
}
newFile << line << '\n';
}
答案 1 :(得分:0)
您正在使用std::getline
阅读行的文字。
您需要在文本行中找到单词,替换单词,然后将文本行写入输出文件。
一种方法是使用std::stringstream
和运算符>>
从字符串中提取单词。
另一种方法是使用std::string::find
来定位单词的位置。
答案 2 :(得分:0)
您可以通过将循环修改为使用std::istringstream
读取的行中的单词读取来实现:
while (getline(openningTheFile, line))
{
std::istringstream iss(line);
std::string word;
bool firstWord = true;
while(iss >> word)
{
if(word == wordToBeDeleted) {
newFile << wordToReplaceWith;
if(!firstWord) {
newFile << " ";
}
firstWord = false;
}
}
newFile << `\n`;
}
答案 3 :(得分:0)
这是一个使用boost::iostreams的力量以高水平但仍然非常灵活的方式解决任务的解决方案。
对于OP的情况,这可能就像使用大锤敲击坚果一样,但如果需要灵活性或必须处理更复杂的情况,它可能是正确的工具。
我使用filtering stream与regular expression结合使用。这允许我们在运行时用替换字符串替换搜索模式,而不创建任何中间字符串。
#include <iostream>
#include <string>
#include <sstream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/regex.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/regex.hpp>
namespace io = boost::iostreams;
using namespace std;
int main()
{
// Your input "file" - you may replace it by an std::ifstream object.
istringstream in( "why waste time learning learninglearning, when ignorance is instantaneous?" );
// Search pattern and substitution string.
string findRegEx( R"(\blearning\b)" );
string replaceStr( "sleeping" );
// Build a regular expression filter and attach it to the input stream.
io::filtering_istream inFiltered;
inFiltered.push( io::regex_filter( boost::regex( findRegEx ), replaceStr ) );
inFiltered.push( in );
// Copy the filtered input to the output, replacing the search word on-the-fly.
// Replace "cout" by your output file, e. g. an std::ofstream object.
io::copy( inFiltered, cout );
cout << endl;
}
<强> Live demo 强>
<强>输出:强>
why waste time sleeping learninglearning, when ignorance is instantaneous?
备注:强>
\blearning\b
\b
表示单词边界)。这就是为什么它只取代了第一次出现&#34;学习&#34;而不是&#34; learninglearning&#34;。