从管道中读取

时间:2011-06-30 21:02:27

标签: c pipe

我需要阅读C PIPE的总结果。我可以创建一个巨大的缓冲区并慢慢填充它,但这似乎效率低下并且非常耗费内存,所以我想知道是否有人有任何想法如何去做。

这是我的代码:

FILE* pipe = popen(command, "r");
if (!pipe)
{
    strcpy("FAIL", output);
    return -1;
}

char buffer[128];

while (!feof(pipe))
{
    if (fgets(buffer, 128, pipe) != NULL)
    {
        // should add buffer to main one here
    }
}

非常感谢任何帮助。

在C ++中,我可以将它添加到String中,但我不确定如何在C中执行此操作。

编辑:我不知道最终缓冲区的大小。

2 个答案:

答案 0 :(得分:4)

  

我可以创建一个巨大的缓冲区并慢慢填充它,但那   似乎效率低下而且记忆力很强   饿

如果你需要一切都在记忆中 - 这是唯一的出路。如果将所有数据收集在一起需要很长时间,您可以将临时结果缓存到临时文件中,但最终您必须以这种或那种方式填充该巨大的内存缓冲区。临时缓存可以是发送方,也可以是接收方,由您决定。

我不确定自己能否跟上你的困境......

修改

经过一些澄清之后,问题似乎是提前知道所需内存的数量。

因为realloc确实是处理方法之一,使用文件作为临时缓存方法也会处理这个问题而不会导致realloc导致的额外内存性能损失(而是因为磁盘I / O要慢得多,所以你的性能会受到影响。

答案 1 :(得分:2)

您可以从相当低的缓冲区大小开始,然后在空间不足时将其加倍。这应该将缓冲区大小保持在合理的范围内,但不会占用大量的重新分配。 (我从评论中收集到你提前知道不必要的大小。)我会说realloc是一个相当安全的赌注,用这种方法你只会叫它几次。