【问题标题】:Print CMD output to .txt with C使用 C 将 CMD 输出打印到 .txt
【发布时间】:2022-11-30 22:10:42
【问题描述】:

有没有人知道如何使用 C 将 CMD 输出保存到 .txt?我想做一个 ping 和 tracert,然后询问是否应该保存结果。如果保存,结果应保存在 .txt 中。

我的代码是这样的:

#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");
    }
}


文本包括:

平: 平 127.0.0.1

跟踪: 跟踪 127.0.0.1

对我来说,只有这个结果是合理的,但我不知道如何改变它以及如何保存 CMD 输出,例如在变量中,然后将其保存在 .txt 中。

【问题讨论】:

  • 您可以为此使用popen
  • @jvx8ss Windows 中的模拟是带下划线的_popen
  • @jvx8ss 感谢您的宝贵时间。我需要在哪里使用它?在 CMD 输出之前还是之前?你能举个我的例子吗? :)

标签: c windows


【解决方案1】:

您的代码非常非常规,这应该是该方法趋向于混乱方向的标志。您将 C 用于通常编写脚本的内容。我将重点关注ping.exe 的使用。

C 中的传统方法是使用 API 来完成您的任务(例如,调用 IcmpSendEcho 而不是 ping.exe)。

另一方面,您的代码正在启动一系列外部流程来完成您的任务,并尝试编排它们。这是脚本语言擅长的,而 C 语言不擅长的。

虽然调用 ping.exe 很简单,但缺点是您只能获得 ping.exe 授予您的控制权。另一方面,如果您使用IcmpSendEcho,您可以完全控制行为和输出。

然而这是可能的。 ping.exe(等)输出到stdout,脚本语言(.cmd、.sh)有重定向标准输出的自然方法。默认情况下,stdout 转到控制台/shell 窗口。您可以使用&gt;(例如ping &gt;output.txt)重定向标准输出。您也可以在您自己的应用程序中重定向标准输出,但这并不像调用 system() 那样简单。

至少你需要使用CreateProcess

SO上有很多相关问题,比如How do I redirect output to a file with CreateProcess?

【讨论】:

  • 感谢您的时间。我知道有很多更好的选择来完成这项任务,例如 powershell。但是我尝试学习 C,为此我尝试给自己布置任务。我尝试给自己分配理论上可以在日常工作中使用的任务。所以也许你可以给我一个例子来更好地理解你的意思。我将不胜感激。
【解决方案2】:

读取命令 ls 并将其保存到缓冲区的简单示例

#include <stdio.h>

#define BUFSIZE 1000

int main()
{
    char buf[BUFSIZE] = {0};

    FILE *p = _popen("ls", "r");
    if (p == NULL) {
        puts("popen failed");
        return 1;
    }

    fread(buf, BUFSIZE - 1, 1, p);
    printf("%s", buf);

    _pclose(p);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 2016-08-02
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多