c++ - 如何在 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 文件为空
解决方案
你有正确的想法。您缺少的是,如果要编写反转的行,则需要将它们写在循环中或将它们存储以备后用。你没有做这两件事。
目前发生的是你覆盖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
in 循环,除非不使用它们会导致代码难以一目了然或理解。这是一种风格/可维护性的事情。要么接受,要么离开它。
推荐阅读
- asp.net - ASP.NET 应用程序大约每 20 分钟回收一次
- laravel - 如何使用 maatwebsite excel 导出相关表中的数据?
- spring - 在 Spring Boot 运行时访问特定的属性文件
- git - 将 Git 存储库从 GCP 迁移到 AWS
- c# - 聚合来自两个不同数据库上下文的数据
- matlab - 如何通过插值从一对图像中制作中间图像
- database - Neo4j DBMS 能否将所有帐户和/或帐户类型的每个用户的并发会话数限制为组织定义的数量?
- java - Android Studio:应用程序在切换活动时崩溃
- wordpress - 在结帐时编辑 Woocommerce 订阅开始日期 + 频率
- android - flutter Google maps eroor:找不到providerinstaller的本地模块描述符类