Gleb
Gleb

Reputation: 53

Using popen as a substitue for "write to file" then "use ifstream to read from it" c++

I am a beginner so please be undertanding if the question is about sth obvious.

The current version of code is shown below. The output.txt is opened using ifstream and then fed to object of type Coll which is used because it understands "understands" the format of output.txt file generated.

std::system("./Pogram > output.txt");
Coll inputout;
    ifstream ifsout("output.txt");
    ifsout >> inputout;

My objective is to get rid of the intermediate output.txt and do sth like shown below.

FILE * f = popen("./Program", "r");
Coll inputout;
f >> inputout;

This yields the following error though:

error: no match for ‘operator>>’ in ‘f >> inputout’

Can you suggest any remedy to that?

Upvotes: 0

Views: 903

Answers (3)

P0W
P0W

Reputation: 47794

May be this could work with pstream :

#include <pstream.h>
#include <string>
#include <iterator>

int main()
{
  redi::ipstream proc("./Program");
  typedef std::istreambuf_iterator<char> it;
  std::string output(it(proc.rdbuf()), it());

  Coll inputout; 
  output>>inputout; // You might have overloaded  ">>"
}

Upvotes: 1

Mats Petersson
Mats Petersson

Reputation: 129364

Your problem is that popen only provides a FILE *, and I don't believe there is any (portable, reliable) way to convert that into a file-stream. So you will have to deal with using fgets to read a line as a C string and stringstream to convert it to your type, or using fscanf or similar.

Upvotes: 1

Lochemage
Lochemage

Reputation: 3974

f is of type FILE which does not have an >> operator. You need to use things like fread() and fwrite(). You also don't get all the fancy type conversions that ifstream lends to you, if you are to use FILE you basically have to read and write directly in bits.

fread(&inputout, sizeof(Coll), 1, f);

This is reading memory from the current file location and putting it into the variable inputout that is the size of a Coll x 1.

Upvotes: 0

Related Questions