我需要阅读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中执行此操作。
编辑:我不知道最终缓冲区的大小。
答案 0 :(得分:4)
我可以创建一个巨大的缓冲区并慢慢填充它,但那 似乎效率低下而且记忆力很强 饿
如果你需要一切都在记忆中 - 这是唯一的出路。如果将所有数据收集在一起需要很长时间,您可以将临时结果缓存到临时文件中,但最终您必须以这种或那种方式填充该巨大的内存缓冲区。临时缓存可以是发送方,也可以是接收方,由您决定。
我不确定自己能否跟上你的困境......
修改强>
经过一些澄清之后,问题似乎是提前知道所需内存的数量。
因为realloc
确实是处理方法之一,使用文件作为临时缓存方法也会处理这个问题而不会导致realloc
导致的额外内存性能损失(而是因为磁盘I / O要慢得多,所以你的性能会受到影响。
答案 1 :(得分:2)
您可以从相当低的缓冲区大小开始,然后在空间不足时将其加倍。这应该将缓冲区大小保持在合理的范围内,但不会占用大量的重新分配。 (我从评论中收集到你提前知道不必要的大小。)我会说realloc
是一个相当安全的赌注,用这种方法你只会叫它几次。