如何将文件复制到另一个文件中,但用用户输入的单词替换单词?

时间:2017-03-10 17:48:01

标签: c++

我正在尝试将文件复制到另一个文件,但是用用户输入的内容更改了一个单词。到目前为止,我已经想出了这个:

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"之后读取单词,因为分隔符是空格。

有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:3)

策略我建议:

  1. 使用std::getline逐行阅读文件。
  2. 使用std::string::find查找要在该行中替换的字符串。
  3. 如果找到,请将其替换为新字符串。
  4. 重复步骤2和3,直到找不到字符串。
  5. 输出更新的行。
  6. 以下是核心代码:

    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 streamregular 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
  • 我们不需要逃避反斜杠,因为我们使用的是raw string literal。对于像这样的东西非常整洁。
  • 正则表达式搜索整个单词&#34;学习&#34; (\b表示单词边界)。这就是为什么它只取代了第一次出现&#34;学习&#34;而不是&#34; learninglearning&#34;。