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

Posted

技术标签:

【中文标题】如何在 C++ 上读取文件、反转部分文本并将反转的部分写入另一个文件?【英文标题】:How to read a file, reverse part of the text and write that reversed part on another file on C++? 【发布时间】:2018-05-03 01:25:08 【问题描述】:

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

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

【问题讨论】:

A) 请缩进代码,b) Why is iostream::eof inside a loop condition considered wrong? C) How to debug small programs 我使用了“ if (i 14) continue ”,所以它只会反转那部分文本,而不是整个文本。 啊,这可以澄清我的一些困惑。您的 line = string(line.rbegin(), line.rend()); 将覆盖您之前的所有工作。 如果您想学习如何将字符串写入文件,请编写一个程序,仅此而已。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

看到这个 sn-p 。对于逐行反转,您可以改用getline(),并在推入vector&lt;string&gt;之前反转。

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>

using namespace std;
int main()

    string str;
    ifstream par2("D:\\MyFolder\\try.txt", ios::in);

    if (par2.is_open())
    
        stringstream strStream;
        strStream << par2.rdbuf();
        str = strStream.str();
        cout << str << endl;
        par2.close();
    

    cout << "\n\nReversing ...\n\n";
    std::reverse(str.begin(), str.end());
    cout << str << endl;


    ofstream mbrapsht("D:\\MyFolder\\try2.txt", ios::out);
    mbrapsht << str;
    mbrapsht.close();

    return 0;

输出:

【讨论】:

@AgonAjredini:哪一部分?

以上是关于如何在 C++ 上读取文件、反转部分文本并将反转的部分写入另一个文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 fstream 的替代方案

CodeEval 挑战:输入文件中的反转字符串

如何反转 AAC 音频文件?

如何在 C++ 中反转字符数组? [关闭]

图像反转:Android

c++反转链表