简体   繁体   中英

C++ Save console output to a text file before quit WINAPI ( No MFC )

I am trying to get my program to log the output of a console application to a text file before it quits. This is a GUI program which launches the console application (tool.exe). The problem is that I am using CTRL + C to quit the console application. This console application cant be altered either. I have tried a few ways of doing this but none have seemed to work ( tool.exe > output.txt ).

Can anyone point me in the right direction of which approach to take ? It would be greatly appreciated.

EDIT:

The file is created but it is empty and does not receive any data. The thing I am after noticing though is if I run the tool from the command line myself, it will work. Eg. c:\\>tool.exe > output.txt However this is not working when its executed from my GUI application.

Here is the code I am using to execute the tool:

    strcpy (tool, "\" start /D \"");
    strcat (tool, toolLocation);
    strcat (tool, "\" tool.exe > output.txt\"");
    system (tool);

This will run tool.exe and create output.txt fine but will not output anything to the file.

EDIT2:

I think what is actually happening is that because I am using start , the >output.txt is outputing start instead of tool.exe . This would explain why it creates the empty file. Start is just running a fresh command line which is then running tool.exe . The problem is, how do I get around this issue now ?

Try:

#include <signal.h>
void signal_handlerkill(int sig)
{
  //Do Soemthing
  exit(1);
}

int main()
{
  signal(SIGINT, signal_handlerkill); //Connect the interrupt signal (^C) to the function
  //Do your code here
  return 0;
}

And if that doesn't work, I'd suggest looking here . Specifically:

// crt_signal.c
// compile with: /c
// Use signal to attach a signal handler to the abort routine
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>

void SignalHandler(int signal)
{
    printf("Application aborting...\n");
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);

    abort();
}

If you run the application without redirecting to a file, do you see the output you need on the console when you press ctrl+c?

If you don't then there is nothing you can do since you cannot change the application.

Update

What you need is to redirect stdout and stderr to the file. I have never done that but jamesdlin seems to have done that. Take a look at his comment.

What you could try is instead of using start try using cmd.exe directly.

This is the code which managed to solve the problem for me:

            char path[500]; //Create character array
            strcpy (path, "cd "); //Copy 'cd' into the array
            strcat (path, toolLocation); //Copy the path of the tool into the array
            strcat (path, " & ip.exe > output.txt"); //Append on the name of the exe and output to a file
            system (path); //Run the built array

I am creating a character array and then appending to it. The vital bit here was the & being used in the system call. This is working as an and and first cd'ing to the firectory before executing the .exe.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM