TheBBC
TheBBC

Reputation: 79

is it possible to grab data from an .exe file in c++?

I am new at C/C++,
So basically I want to call an .exe file that displays 2 numbers and be able to grab those two numbers to use them in my code. To call the .exe file I've used the system command, but I am still not able to grab those two numbers that are displayed by the .exe file

char *files = "MyPath\file.exe";
system (files);

Upvotes: 1

Views: 703

Answers (2)

Galik
Galik

Reputation: 48625

You need to escapr back slashes in C++ string literals so:

// note the double "\\"
char* files = "MyPath\\file.exe";

Or just use forward slashes:

char* files = "MyPath/file.exe";

Its not very efficient but one thing you can to with std::system is redirect the output to a file and then read the file:

#include <cstdlib>
#include <fstream>
#include <iostream>

int main()
{
    // redirect > the output to a file called output.txt
    if(std::system("MyPath\\file.exe > output.txt") != 0)
    {
        std::cerr << "ERROR: calling system\n";
        return 1; // error code
    }

    // open a file to the output data
    std::ifstream ifs("output.txt");

    if(!ifs.is_open())
    {
        std::cerr << "ERROR: opening output file\n";
        return 1; // error code
    }

    int num1, num2;

    if(!(ifs >> num1 >> num2))
    {
        std::cerr << "ERROR: reading numbers\n";
        return 1; // error code
    }

    // do something with the numbers here
    std::cout << "num1: " << num1 << '\n';
    std::cout << "num2: " << num2 << '\n';
}

NOTE: (thnx @VermillionAzure)

Note that system doesn't always work everywhere because unicorn environments. Also, shells can differ from each other, like cmd.exe and bash. – VermillionAzure

When using std::system the results are platform dependant and not all shells will have redirection or use the same syntax or even exist!

Upvotes: 1

golobitch
golobitch

Reputation: 1334

I think this is better aproach: Here you just create new process, and you read data that process gives you. I tested this on OS X 10.11 with .sh file and works like a charm. I think that this would probably work on Windows also.

FILE *fp = popen("path to exe","r");
if (fp == NULL)
{
    std::cout << "Popen is null" << std::endl;
}else
{
    char buff[100];
    while ( fgets( buff, sizeof(buff), fp ) != NULL )
    {
        std::cout << buff;
    }
}

Upvotes: 2

Related Questions