为什么我可以替换文本文件中的一个单词而不替换另一个单词?

时间:2016-04-28 22:02:47

标签: c++

我正在逐字阅读以下文字文件,取代“@ name @”和“@ festival @”。我的程序适用于@ name @,但只改变了第一个@ festival @,而不是第二个。我不知道为什么。

John Doe

213-A室

通用旧建筑

信息技术学院

州立大学编程

纽约纽约12345-0987

USA

收件人:@name @

主题:季节的问候:@festival @

亲爱的@name @,

非常@节日@给你和你的家人!

您诚挚的,

约翰

td

2 个答案:

答案 0 :(得分:1)

问题是内在的条件,如果在@ festival @之后存在' '则不然。以下代码是正确的

void Main::readFile()
{
while (v.size() != 0) {
    string name;
    name = v.at(v.size()-1);
    v.pop_back();
    std::ofstream out(name + ".txt");
    ifstream file;
    file.open("letter.txt");
    string word;
    string comma;
    char x;
    word.clear();

    while (!file.eof())

{
    x = file.get();

    while (x != ' ' && x != std::ifstream::traits_type::eof())
    {
        if (word == "@name@") {
            word = name;
        }
        if (word == "@festival@") {
            word = "THISISATEST!!!!!!!!!!!!!!";
        }
        word = word + x;
        x = file.get();
    }
    if (word == "@name@") {
          word = name;
    }
    if (word == "@festival@") {
        word = "THISISATEST!!!!!!!!!!!!!!";
    }

    out << word + " ";
    word.clear();
    }
}

答案 1 :(得分:0)

首先,请参阅Why is iostream::eof inside a loop condition considered wrong?

这不是一个优雅的解决方案......但是对原始代码有了更好的改进。 (我会让你想到一个更有效的解决方案):

void Main::readFile()
{
while (v.size() != 0) {
    string name;
    name = v.at(v.size()-1);
    v.pop_back();
    std::ofstream out(name + ".txt");
    ifstream file;
    file.open("letter.txt");

    string festival = "THISISATEST!!!";
    string line, nameHolder = "@name@", festivalHolder = "@festival@";
    while (std::getline(file, line))
    {
        std::size_t n_i = line.find(nameHolder);
        if(n_i != std::string::npos)
            line.replace(n_i, nameHolder.size(), name);

        std::size_t f_i = line.find(festivalHolder);
        if(f_i != std::string::npos)
            line.replace(f_i, festivalHolder.size(), festival);

        out << line << '\n';
    }
}