You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:54:04