我想用C语言写,我用popen来写。
FILE *stdoutPtr = popen(command,"r");
fseek(stdoutPtr, 0L, SEEK_END);
long pos = ftell(stdoutPtr);
这里我想得到
stdout
的大小,以便初始化缓冲区但是pos
变量总是-1。pos
应该告诉我读指针的当前位置。请帮忙。。。。
最佳答案
FILE
返回的popen
不是一个常规文件,而是一个名为apipe
的文件(这就是p
的意思)数据从调用到程序的命令的stdout通过管道因为它是一个通信通道,而不是磁盘上的文件,所以管道没有确定的大小,您不能在数据流中寻找不同的位置因此,当应用于此fseek
时,ftell
and FILE
都将失败,这就是-1
返回值的含义如果在调用errno
之后立即检查ftell
,您将发现它具有值ESPIPE
,这意味着“您不能对管道执行此操作”
如果您试图将命令的所有输出读取到单个char*
缓冲区中,唯一的方法是重复调用其中一个读取函数,直到它指示文件结束,并根据需要使用realloc
放大缓冲区如果输出可能很大,那么最好更改程序以分块处理数据,如果有任何方法可以这样做的话。