首页 > 解决方案 > 如何在 C++ 上读取文件、反转部分文本并将反转的部分写入另一个文件?

问题描述

我需要帮助,我写了代码,做了相反的事情,但我不能把它写在另一个文件上。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream par2("C:/fajllat/f1.bin", ios::in);
    string line;

    for (int i = 1; !par2.eof() ; i++)
    {
        getline(par2, line);

        if (i < 5 || i >14)  continue;
        line = string(line.rbegin(), line.rend());

    }
    par2.close();

    ofstream mbrapsht ("C:/fajllat/f3.bin", ios::out);

    mbrapsht << line;

    mbrapsht.close();
    cin.get();cin.get();

    return 0;
}

当我检查文件时 f3.bin 文件为空

标签: c++stringfile

解决方案


你有正确的想法。您缺少的是,如果要编写反转的行,则需要将它们写在循环中或将它们存储以备后用。你没有做这两件事。

目前发生的是你覆盖line每个循环。那个字符串中剩下的就是你之后写的。事实证明,对于您的情况,这是一个空字符串。

让我们对您拥有的内容进行最小的更改:

// (*) Open the output file before looping
ofstream mbrapsht("C:/fajllat/f3.bin", ios::out);

for (int i = 1; !par2.eof() ; i++)
{
   getline(par2, line);
   if (i < 5 || i > 14)  continue;
   line = string(line.rbegin(), line.rend());

   // (*) output the line - you also probably want an end-of-line
   mbrapsht << line << std::endl;
}

现在,没关系。但它确实有一个问题,如果getline失败,您的代码仍然会再运行一次循环体。如果getline遇到文件末尾(或其他一些错误状态),就会发生这种情况,直到下一次迭代(或者可能永远不会,如果错误不是 EOF),您的循环才会拾取。

因此,一个更好的选择可能是:

for(int lineNo = 1; std::getline(par2, line); ++lineNo)
{
    if (lineNo >= 5 && lineNo <= 14)
    {
        std::reverse(line.begin(), line.end());  // (*) requires <algorithm>
        mbrapsht << line << std::endl;
    }
}

请注意,我还反转了您的测试条件并删除了continue. 一般来说,我会避免continuebreakin 循环,除非不使用它们会导致代码难以一目了然或理解。这是一种风格/可维护性的事情。要么接受,要么离开它。


推荐阅读