home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / gnu / g / help / 1170 < prev    next >
Encoding:
Text File  |  1992-08-31  |  1.9 KB  |  69 lines

  1. Path: sparky!uunet!cs.utexas.edu!sun-barr!ames!agate!forney.berkeley.edu!jbuck
  2. From: jbuck@forney.berkeley.edu (Joe Buck)
  3. Newsgroups: gnu.g++.help
  4. Subject: Re: stream class with popen?
  5. Date: 31 Aug 1992 19:04:04 GMT
  6. Organization: U. C. Berkeley
  7. Lines: 57
  8. Message-ID: <17tqf4INN8rm@agate.berkeley.edu>
  9. References: <92Aug31.092656edt.133099@wotan.ai.toronto.edu>
  10. NNTP-Posting-Host: forney.berkeley.edu
  11.  
  12. In article <92Aug31.092656edt.133099@wotan.ai.toronto.edu> kramer@cs.toronto.edu ("Bryan M. Kramer") writes:
  13. >Is there a stream class (g++ 2.2.2) that supports something
  14. >like popen? I'd like to connect a stream to a pipe.
  15.  
  16. Yes, almost; that is, there is a class derived from streambuf called
  17. procbuf that does what you want.  Here is an example program.  It takes
  18. two arguments; the first is the name of a file, the second is a command.
  19. The program reads the file and pipes it through the command.  The command
  20. is expanded by /bin/sh, so shell metacharacters work (or must be escaped
  21. if that's not what you want).
  22.  
  23. Here's the program:
  24.  
  25. --------------------------------------------------------------------------
  26. #include <procbuf.h>
  27. #include <fstream.h>
  28. #include <iostream.h>
  29.  
  30. main (int argc, char** argv) {
  31.     if (argc != 3) {
  32.         cerr << "Usage: " << argv[0] << " file 'command'\n";
  33.         return 1;
  34.     }
  35.  
  36.     // open the file with an ifstream
  37.  
  38.     ifstream istr(argv[1]);
  39.     if (!istr) {
  40.         cerr << argv[0] << ": Can't open file " << argv[1] << "\n";
  41.         return 1;
  42.     }
  43.  
  44.     // create a procbuf with the command and attach it to an ostream.
  45.     // we could also have used ios::in and attached to an istream to
  46.     // read from a command.
  47.  
  48.     procbuf pbuf(argv[2], ios::out);
  49.     ostream ostr(&pbuf);
  50.  
  51.     // not sure this is the right way to check for failure
  52.  
  53.     if (!ostr) {
  54.         cerr << argv[0] << ": Can't open pipe to '" << argv[2] << "'\n";
  55.         return 1;
  56.     }
  57.  
  58.     // copy everything from one stream to the other
  59.  
  60.     char ch;
  61.     while (istr.get(ch)) ostr.put(ch);
  62.     return 0;
  63. }
  64.  
  65.  
  66.  
  67. --
  68. Joe Buck    jbuck@ohm.berkeley.edu
  69.