2014-09-20 48 views
1

我打开给定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管流。

+0

不是纯C的问题吗?你使用C++中最糟糕的方法。 – Basilevs 2014-09-20 16:39:10

+0

看这里:http://www.cplusplus.com/reference/istream/istream/peek/ – HRold 2014-09-20 16:39:55

+0

'FILE *'没有'peek'方法,我不能使用它。 – Benio 2014-09-20 16:55:46

回答

3

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

你基本上无法从pipe(7)(内部使用popen(3) ...)处理数据,而无需耗费它,因为管道是非可查找(lseek(2)会失败ESPIPEmmap(2)会失败EACCESS

你可以任一命令重定向到一些临时文件(使用较低级forkdup2execvesyscalls(2),如在Advanced Linux Programming解释)然后处理该文件和倒带(和/或其他地方重新发送)或读取吨的所有数据他钻进内存(所以可用内存是一个限制因素)。

+1

管道不可查找的事实是关键。现在它像一个魅力。谢谢。 – Benio 2014-09-20 17:51:40