【发布时间】:2021-01-04 15:47:29
【问题描述】:
我想解析popen(3) 的输出,但看起来我必须重复popen() 调用。
#include <stdio.h>
int main(int argc, char *argv[]) {
int v1, v2, v3;
char unused[255];
FILE *f;
f = popen("ip -V", "r");
fscanf(f, "ip utility, iproute2-v%d.%d.%d-%s", &v1, &v2, &v3, unused);
printf("%d.%d.%d (%s)\n", v1, v2, v3, unused);
f = popen("ip -V", "r"); // TODO: how to avoid repeating popen()?
fscanf(f, "ip utility, iproute2-%d.%d.%d", &v1, &v2, &v3);
printf("%d.%d.%d\n", v1, v2, v3);
pclose(f);
return 0;
}
在这个版本上测试:
$ ip -V
ip utility, iproute2-5.8.0
不重复,保持旧值:
$ ./fscanf-popen
32764.-1446225616.0 ()
32764.-1446225616.0
随着重复它会正确处理它:
$ ./fscanf-popen
32765.1933255568.0 ()
5.8.0
fseek(f, 0, SEEK_SET); 和 rewind(f); 没有帮助。
我必须错过一些明显的东西。
【问题讨论】:
-
如果我们想使用两次数据,你应该存储它。
-
在第一次通话中,您有
iproute2-v%d.%d.%d,格式字符串中有一个额外的v。v不在第二次尝试中。我建议你检查一下fscanfcalls return。 -
...但在您的情况下,您只需要确保在格式字符串中使用
,,并检查scanf返回的值。 -
至于您的问题,将直到
EOF之前的所有输出读入内存缓冲区。然后改为解析该缓冲区。 -
@Someprogrammerdude 我删除了检查代码以简化示例。但即使有了代码,也需要更多尝试。