我想用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放大缓冲区如果输出可能很大,那么最好更改程序以分块处理数据,如果有任何方法可以这样做的话。

10-08 02:22