C语言fscanf读取popen输出仅返回部分内容如何解决
问题根因
fscanf的%s格式化符默认以任意空白字符(空格、换行、制表符等)为结束标志,/bin/file ola.png的输出内容中,第一个空白字符出现在ola.png:之后,因此%s只会读取到ola.png:就终止,导致内容不完整。- 你第一段使用
w模式的代码逻辑本身是错误的:popen指定w模式时,是打开进程的标准输入流用于写入,而非读取输出,此时调用fscanf读属于未定义行为,能输出完整内容纯属巧合,无参考价值。
正确实现方案
方案1:单场景下用fgets读取整行
file命令的输出默认是单行内容,直接用fgets读取整行即可拿到完整输出,示例代码如下:
#include <stdio.h> #include <stdlib.h> int main() { char buff[1024]; // 建议扩大缓冲区避免内容截断 FILE *pf = popen("/bin/file ola.png", "r"); if (pf == NULL) { perror("popen failed"); return 1; } // fgets会读取到换行符或者缓冲区满为止,默认包含空格等所有字符 if (fgets(buff, sizeof(buff), pf) != NULL) { printf("%s", buff); } pclose(pf); return 0; }
方案2:多行长输出场景循环读取
如果要读取的命令输出存在多行,可以循环调用fgets直到返回NULL,即可拿到所有输出内容,示例代码片段如下:
char buff[1024]; FILE *pf = popen("your command", "r"); if (pf == NULL) { perror("popen failed"); return 1; } while (fgets(buff, sizeof(buff), pf) != NULL) { // 这里可以自行处理每一行内容,比如拼接到大缓冲区 printf("%s", buff); } pclose(pf);
注意事项
- 必须判断
popen的返回值是否为NULL,避免进程启动失败导致后续操作崩溃。 - 缓冲区大小要根据命令输出的最大长度合理设置,避免内容被截断。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

