ftell函数在C中为stdout赋予-1

Rah*_*hul 1 c popen

我想在C中使用,我正在使用popen这样做.

FILE *stdoutPtr = popen(command,"r");
fseek(stdoutPtr, 0L, SEEK_END);
long pos = ftell(stdoutPtr);
Run Code Online (Sandbox Code Playgroud)

在这里,我想获得大小,stdout以便我可以初始化缓冲区.但pos变量总是-1. pos应该告诉我读指针的当前位置.

请帮忙....

zwo*_*wol 6

FILE返回的popen不是一个普通的文件,但被称为一件事pipe.(这就是p代表的含义.)数据从您调用到程序的命令的标准输出管道中流管道.因为它是通信通道而不是磁盘上的文件,所以管道没有确定的大小,并且您无法在数据流中寻找不同的位置.因此,fseekftell当应用于此都将失败FILE,这就是一个-1返回值表示.如果您errno在调用之后立即检查ftell它将发现它具有值ESPIPE,这意味着"您不能对管道执行此操作".

如果您尝试将命令的所有输出读入单个char*缓冲区,唯一的方法是重复调用其中一个读取函数,直到它指示文件结束,并根据需要使用放大缓冲区realloc.如果输出可能很大,那么最好更改程序以处理块中的数据,如果有任何方法可以做到这一点.