如何用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
相关产品推荐
相关产品推荐

