如何在 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
。一般来说,我避免在循环中使用continue
和break
,除非不使用它们会导致代码难以一目了然或理解。这是一种风格/可维护性的事情。要么接受,要么离开。
【讨论】:
【参考方案2】:看到这个 sn-p 。对于逐行反转,您可以改用getline()
,并在推入vector<string>
之前反转。
#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++ 上读取文件、反转部分文本并将反转的部分写入另一个文件?的主要内容,如果未能解决你的问题,请参考以下文章