我打開給定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
管流。
我打開給定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
管流。
我猜你是在Linux或其他POSIX系統上。
你基本上無法從pipe(7)(內部使用popen(3) ...)處理數據,而無需耗費它,因爲管道是非可查找(lseek(2)會失敗ESPIPE
,mmap(2)會失敗EACCESS
)
你可以任一命令重定向到一些臨時文件(使用較低級fork
,dup2
,execve
syscalls(2),如在Advanced Linux Programming解釋)然後處理該文件和倒帶(和/或其他地方重新發送)或讀取噸的所有數據他鑽進內存(所以可用內存是一個限制因素)。
管道不可查找的事實是關鍵。現在它像一個魅力。謝謝。 – Benio 2014-09-20 17:51:40
不是純C的問題嗎?你使用C++中最糟糕的方法。 – Basilevs 2014-09-20 16:39:10
看這裏:http://www.cplusplus.com/reference/istream/istream/peek/ – HRold 2014-09-20 16:39:55
'FILE *'沒有'peek'方法,我不能使用它。 – Benio 2014-09-20 16:55:46