C ++在文本文件中的特定字符后插入新行
Posted
技术标签:
【中文标题】C ++在文本文件中的特定字符后插入新行【英文标题】:C++ Inserting a new line after a specific character in a text file 【发布时间】:2018-12-30 14:01:45 【问题描述】:我正在寻找一种方法来搜索文本文件中的特定字符并在每个 ;
之后添加一个换行符
如果重要的话,这是一个相当大的文档 (2,7MB)。
【问题讨论】:
您还在等什么?是否应该有人编写完整的程序并将其放在这里?这个网站是用于与编程相关的问答,而不是“做我的工作”;)所以请向我们展示您已经编程的内容以及您需要我们帮助的问题是什么。请求一个完整的程序不是我们在 SO 上所期望的! “插入”一个字符到现有的文本文件中并不能真正完成,因为您必须将文本移动到插入点之后,并且对于一个非平凡的文件。最简单的方法是从头开始重写文件,在需要时插入新字符。使用临时文件和文件重命名,或者将其全部加载到内存中。 除非您使用的是内存有限的非常小的系统,否则它应该是安全的。我建议你先为字符串预分配内存,如果你这样做的话。否则,我会推荐一个字符串向量,其中每个字符串都是应该写入的“行”,即您读取分号分隔的字符串。当您写回数据时,它会使换行符的插入变得非常简单。 听起来像是sed
或 awk
的工作。
@Ayxan 不,因为that overload of operator>>
(参见#11)执行未格式化读取。它将按原样读取输入流,直到到达流的末尾或发生错误。因此,您正在查看的示例中的循环是不必要的。
【参考方案1】:
您不能在现有文件的中间插入新字符,只能追加到末尾。您必须创建一个新文件,将旧文件中的字符复制到新文件中,并根据需要插入新字符。例如:
#include <string>
#include <fstream>
int main()
std::ifstream inFile("input.txt");
if (!inFile.is_open())
std::cerr << "Failed to open input file";
return 1;
std::ofstream outFile("output.txt");
if (!outFile.is_open())
std::cerr << "Failed to create output file";
return 1;
std::string line;
while (std::getline(inFile, line, ';'))
outFile << line;
if (!inFile.eof())
outFile << ";\n";
return 0;
【讨论】:
【参考方案2】:正如 SomeProgrammerdude 在 cmets 中指出的那样,插入现有文件实际上并不可行,您的选择之一是将其全部读入单个 std::string
并写回同一个文本文件。
这是一个示例实现。我们一次读取一个章程并检查它是否是分号,并在每个分号后添加一个换行符。注意reserve
部分,虽然建议,但它不是强制性的:
#include <string>
#include <fstream>
#include <stdexcept>
int main()
std::fstream f("test.txt", std::ios::in);
if (!f.is_open())
throw std::runtime_error("Failed to open file");
std::string contents;
contents.reserve(10000); // reserve some space for better efficiency
char ch;
while (f.get(ch))
contents.push_back(ch);
if (ch == ';')
contents.push_back('\n');
f.close();
f.open("test.txt", std::ios::out);
if (!f.is_open())
throw std::runtime_error("Failed to open file");
f << contents;
f.close();
return 0;
输入:
line line line line; line line line line; line line line; line line
输出:
line line line line;
line line line line;
line line line;
line line
注意行前的前导空格。这是因为我们在每个';'
之后附加了'\n'
,并没有替换空格。
【讨论】:
您在调用push_back(ch)
之前没有初始化ch
,因为您在进入循环之前缺少对f.get()
的初始调用(请参阅Why is iostream::eof inside a loop condition considered wrong?)。您应该将while (!f.eof())
替换为while (f.get(ch))
,并去掉循环内的f.get()
调用。
@RemyLebeau 感谢您的反馈!更新了答案。还有什么建议吗?
您没有检查第二个open()
是成功还是失败。而且,如果您要使用异常处理,请考虑改用 fstream 的 exceptions()
方法。以上是关于C ++在文本文件中的特定字符后插入新行的主要内容,如果未能解决你的问题,请参考以下文章