2014-09-20 102 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