C ++以缓冲速率从STDIN读取输入

时间:2015-04-10 21:32:47

标签: c++ string c++11 buffer stdin

我正在获取txt文件的内容并将其发送到我的应用程序中,如下所示。

cat file.txt | ./app [args]

我的问题是,我处理应用程序的当前方式基本上是采用' file.txt'的全部内容。并将其存储在STDIN中。

这适用于相对较小的文件,但如果TXT文件太大,将导致应用程序崩溃/溢出。

我正在寻找一种解决方案,它允许我以“缓冲速率”从文件中读取数据"以便在程序开始时不会存储文件的全部内容。

她是我目前正在接受输入的片段。

  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;
}

这当前有效并将采取正确的输入。但显然这不是高效的代码,并且存在一些更大问题的可能性。

我只是喜欢&#34;处理&#34;来自TXT文件的数据,而不是将整个文件内容存储在内存中。

我目前正在使用C ++,所以我不想使用旧的标准C函数。老实说,我更喜欢C ++ 11及以上。

感谢您提前提供任何帮助。

编辑:

我想澄清一下,我首先将每个单独的行存储在向量中,以便分别对每行进行处理。我知道我可以处理每一行,但这仍然会带来一个潜在的问题,如果一个文件不包含换行符,那么我仍然会冒溢出来和潜在的问题。

编辑:

我知道大多数时候这种情况极不可能。但是,对于这篇文章,这不是我的担忧。

1 个答案:

答案 0 :(得分:0)

  

这适用于相对较小但会导致该文件的文件   如果TXT文件太大,应用程序将崩溃/溢出。

我怀疑你的担心为时过早。

无论有多少字符串或多少字节,我系统上的向量大小约为12个字节。虽然我还没有确认,但我认为这意味着你的载体内容会存在你的堆中。

我的机器有4 GB的ram,并且交换相同(虽然交换速度很慢)。这需要一个非常大的文件来填充那么多内存。

我经常使用std :: stringstream将整个文件传输到ram中,如:

  m_ss << sIn.rdbuf();
  if(sIn.bad())
     throw "DTB::Filter::load()  'm_ss << sIn bad after rdbuff()'";

然后从字符串流中逐行处理它,或者,有时我会使用捷径并将整个文件作为使用stringstream.str()复制的单个字符串处理

检查您的计划 - 您的文本文件是否会比您的ram更大?


接下来考虑按照您现在的计划构建它。

改变逐行处理有多难?

像我一样使用stringstream,重构非常简单。 RAM也比我的驱动器(大部分)快得多。

虽然我还没有找到需要,但可以对文件进行统计,并让您的代码在运行时确定其大小足以跳过字符串流或向量临时存储。

1)&#34;加载容器+逐行加载ram&#34;花费更多时间2)&#34;逐行处理文件&#34;?

我不知道。我不会使用技嘉文本文件,但我想我可以创建一个,并测量它......也许以后当我满足真正的需求时。