c++ - 如何读取一个文件,反转文本的一部分并将反转的部分写入 C++ 上的另一个文件?

标签 c++ string file

我需要帮助,我写了代码,做了相反的事情,但我无法将它写入另一个文件。

#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 文件是空的

最佳答案

你的想法是正确的。你缺少的是,如果你想写反线,你需要将它们写在循环内或将它们存储起来以备后用。这些事情你都没有做。

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

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

// (*) 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。一般来说,我会避免在循环中使用 continuebreak 除非不使用它们会导致代码难以理解或一目了然。这是一种风格/可维护性的事情。要么接受要么离开。

关于c++ - 如何读取一个文件,反转文本的一部分并将反转的部分写入 C++ 上的另一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50145672/

相关文章:

c++ - 打开简历。模糊后估计内核

c++ - 在 C++ 中将大于 5 位的数字除以 2 时会失去精度

c++ - 从字符串中获取 IPv4 地址的最快方法

Python 错误 : TypeError: a bytes-like object is required, 不是 'str'

.net - 我应该在.NET应用程序中使用binary/xml文件吗?

python - 使用 matplotlib 按列绘制 csv 文件的图表

c# - 如何获取可用视频捕获设备的列表

string - 移动到缓冲区内字符串的末尾 - 汇编语言

C++验证字符串1是否存在于字符串2中

java - 将 tiff 转换为缓冲图像 (Java)