【发布时间】:2015-04-10 21:32:46
【问题描述】:
我正在获取一个 txt 文件的内容并将其传送到我的应用程序中,如下所示。
猫文件.txt | ./app [参数]
我的问题是,我当前处理应用程序的方式本质上是获取“file.txt”的全部内容并将其存储在 STDIN 中。
这适用于相对较小的文件,但如果 TXT 文件太大会导致应用程序崩溃/溢出。
我正在寻找一种解决方案,它允许我以“缓冲速率”从文件中读取数据,这样在程序开始时不会存储文件的全部内容。
她是我目前如何接受输入的一个 sn-p。
std::vector<string> lines = LinesInFile(std::cin); // Storing lines
它利用了以下函数。
std::vector<std::string> LinesInFile(std::istream& input_file) {
std::string text_from_input;
std::vector<std::string> lines_from_file;
while (std::getline(input_file, text_from_input)) {
lines_from_file.push_back(text_from_input);
}
return lines_from_file;
}
这目前有效,并将采用正确的输入。但显然这不是生产性代码,并且可能会出现一些更大的问题。
我只想“处理”来自 TXT 文件的数据,而不是将文件的全部内容存储在内存中。
我目前正在使用 C++,所以我不想使用旧的标准 C 函数。老实说,我更喜欢 C++11 及更高版本。
提前感谢您的帮助。
编辑:
我想澄清一下,我首先将每个单独的行存储在向量中以单独处理每一行。我知道我可以处理每一行,但这仍然会带来一个潜在的问题,如果文件不包含换行符,那么我仍然会有溢出和潜在问题的风险。
编辑:
我知道这在大多数情况下是极不可能的。但是,这不是我对这篇文章的关注。
【问题讨论】:
-
那么为什么不处理 while 内的行而不是将它们推入数组?
-
嗯,最初我所做的是获取每一行并将其数据推回向量中。完成分离和存储每一行后,我将返回该向量并稍后在不同进程中使用该向量。
-
基本上我正在处理每一行。在这一点上,我认为我可以在处理文件时内联处理数据并搜索“\n”或 EOF。而不是像我现在一样拆分每一行。我需要改进我的方法的部分帮助,我会让 ATM 有点乱。
-
如果我只逐行处理,另一个潜在问题是,如果文件永远没有返回字符。那么它将基本上是一条巨大的线,我将再次遇到我可能的溢出问题。
-
stdin 是默认缓冲。但是您编写了代码来一次提取所有内容并将其保存在内存中?好吧,那就不要那样做。一次处理每一行。这太奇怪了,我不确定我是否完全理解这个问题。如果一行不包含换行符,则没有溢出问题,唯一的问题是 bad_alloc。正确的做法是打印错误并退出。实际上很简单。
标签: c++ string c++11 buffer stdin