计算管道流中的行而不消耗

时间:2014-09-20 16:35:47

标签: c++11

我用给定的cmd命令打开一个管道流:

FILE* fp = popen(cmd.c_str(), "r");

如何在不消费的情况下统计其线条?


我试过了:

char* line = NULL;
size_t len = 0;
unsigned int lines = 0;

while(getline(&line, &len, fp) != -1){
    ++lines;
}

但它消耗fp管道流。

1 个答案:

答案 0 :(得分:3)

我猜你是在Linux或其他POSIX系统上。

你基本上无法处理来自pipe(7)的数据(由popen(3)内部使用...)而不用消费它,因为管道是不可搜索的({{3如果ESPIPE失败,lseek(2)将失败EACCESS

您可以将命令重定向到某个临时文件(使用较低级别forkdup2execve mmap(2),如syscalls(2)中所述)然后处理文件并将其倒回(和/或在别处重新发送)或将管道中的所有数据读入内存(因此可用内存是限制因素)。