我需要帮助,我写了代码,做了相反的事情,但我无法将它写入另一个文件。
#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
。一般来说,我会避免在循环中使用 continue
和 break
除非不使用它们会导致代码难以理解或一目了然。这是一种风格/可维护性的事情。要么接受要么离开。
关于c++ - 如何读取一个文件,反转文本的一部分并将反转的部分写入 C++ 上的另一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50145672/