简体   繁体   中英

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?

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.

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  ">>"
}

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.

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