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

如何用C语言将CMD的ping、tracert输出保存到TXT文件?

问题:用C语言执行ping/tracert并捕获输出保存到文件

原代码尝试执行ping 127.0.0.1和tracert 127.0.0.1,并询问用户是否保存输出,但最终只保存了命令字符串,而非命令执行的实际结果。原代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main ()
{

    char Testprint1[100],Testprint2[100];

    sprintf(Testprint2, "ping 127.0.0.1");
    system(Testprint2);

    sprintf(Testprint2, "tracert 127.0.0.1");
    system(Testprint2);

    printf("\nDo you want to save the output? (y)Yes / (n)No: ");

    if (Answer=='j')
    {
    FILE *Test;
    Test = fopen("Test_Log.txt", "w");
    fprintf(Test, "Ping:\n%s\n\nTracert:\n%s\n",Testprint1,Testprint2);

        if(Pinglog == NULL) 
        {
        printf("Log could not be saved.\n");
            system("\n\npause\n");
        }
        else
        {
            printf("Log has been saved.");
            fclose(Pinglog);
            system("cls");
        }
    }

    else if(Answer=='n')
    {
        system("cls");
        system("\n\npause\n");
    }
}

原代码的核心问题

  • 未捕获命令输出:system()函数仅执行命令并输出到控制台,不会返回命令的执行结果,所以Testprint1和Testprint2只存储了命令字符串,而非输出内容。
  • 变量未定义:Answer和Pinglog变量未声明,编译会报错。
  • 文件操作逻辑错误:打开的文件指针是Test,但判断和关闭的是未定义的Pinglog。

修正后的代码

使用popen()函数替代system(),它可以创建管道并读取命令的输出内容,同时修复变量和文件操作的错误:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 读取命令输出并写入文件的函数
void capture_command_output(const char* cmd, FILE* log_file, const char* label) {
    char buffer[1024];
    FILE* pipe = popen(cmd, "r");
    if (!pipe) {
        fprintf(log_file, "%s 执行失败,无法捕获输出\n", label);
        return;
    }

    fprintf(log_file, "%s:\n", label);
    // 逐行读取命令输出并写入日志文件
    while (fgets(buffer, sizeof(buffer), pipe) != NULL) {
        fprintf(log_file, "%s", buffer);
    }
    fprintf(log_file, "\n");
    pclose(pipe);
}

int main() {
    const char* ping_cmd = "ping 127.0.0.1";
    const char* tracert_cmd = "tracert 127.0.0.1";
    
    // 先执行命令并输出到控制台
    printf("=== 执行 ping 命令 ===\n");
    system(ping_cmd);
    printf("\n=== 执行 tracert 命令 ===\n");
    system(tracert_cmd);

    // 询问用户是否保存输出
    printf("\nDo you want to save the output? (y)Yes / (n)No: ");
    char answer;
    // 读取用户输入,处理换行符
    scanf(" %c", &answer);

    if (answer == 'y' || answer == 'Y') {
        FILE* log_file = fopen("Test_Log.txt", "w");
        if (!log_file) {
            printf("Log could not be saved.\n");
            system("pause");
            return 1;
        }

        // 捕获命令输出并写入文件
        capture_command_output(ping_cmd, log_file, "Ping");
        capture_command_output(tracert_cmd, log_file, "Tracert");

        fclose(log_file);
        printf("Log has been saved.\n");
    } else if (answer == 'n' || answer == 'N') {
        printf("输出未保存。\n");
    } else {
        printf("输入无效,输出未保存。\n");
    }

    system("pause");
    return 0;
}

关键改动说明

  • 使用popen()捕获输出:popen(cmd, "r")会创建一个管道,以只读方式读取命令的标准输出,通过fgets()逐行读取内容。
  • 封装捕获逻辑:将捕获命令输出的代码封装成capture_command_output函数,复用代码并提高可读性。
  • 修复变量和文件操作:声明answer变量存储用户输入,使用正确的文件指针log_file进行打开、写入和关闭操作。
  • 保留控制台输出:先通过system()输出命令结果到控制台,再在用户确认保存时重新捕获写入文件,兼顾交互体验和保存需求。

内容的提问来源于stack exchange,提问作者Sergej Wozke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:01:35