Solved

simple cin/cout ?

Posted on 1998-09-10
12
553 Views
Last Modified: 2008-02-01
I would like to read stdin until there is no more stdin, and then dump it to stdout.
Catch is: I must be able to do this with binary and ascii files, and I need to implement it with the stl.

(If this cannot be done with binaries - please let me know why. I have a feeling that because stdin is a text stream, that it won't work).

I am writing a pipe application.
I need to feed the pipe data to an out of process OLE server eventually.

Regards
-craig.
0
Comment
Question by:cmain
  • 5
  • 2
  • 2
  • +3
12 Comments
 
LVL 3

Expert Comment

by:gcauthon
ID: 1172429
#include <stdio.h>

int main(void)
{
   char data;
   while(fread(&data,1,1,stdin)==1)
   {
      printf("%c",data);
   }
   return (0);
}
0
 
LVL 1

Author Comment

by:cmain
ID: 1172430
I asked for an implementation using STL.
(Standard Template Library).

0
 
LVL 1

Author Comment

by:cmain
ID: 1172431
I would also like to know the number of bytes that were piped into the application??

Thanks
-craig.
0
Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

 
LVL 2

Expert Comment

by:JYoungman
ID: 1172432
Why use the STL?  Why not just use <iostream>?  
0
 
LVL 2

Expert Comment

by:JYoungman
ID: 1172433
#include <iostream>
int main()
{
  unsigned char ch;
  unsigned long count;
  while ( (cin >> ch).good() )
    {
    ++count;
    cout << ch;
    }
    // optionally:-
    cerr << "Transferred " << count << " bytes\n";
    return 0;
}

0
 
LVL 1

Author Comment

by:cmain
ID: 1172434
That works fine,
there is just one problem.

It stops at the first eof / non printable character.
I need to be able to pipe binary data. I want to use C++ io.
Your suggestion is fine except for the binary data problem.
0
 
LVL 22

Expert Comment

by:nietod
ID: 1172435
I believe that a stream can be switched between binary and text mode.  But I can't see how at the moment.
0
 
LVL 1

Author Comment

by:cmain
ID: 1172436
I have here a sample program.
This actually works, sort of.
Call this application MYAPP

I can do the following.

cat MYFILE | MYAPP > NewFile.

The problem is that MYFILE is approximately 1300 bytes bigger than the resultant NewFile.

I know for a fact that my cat program works correctly.
I don't have source but...
cat MYFILE | cat > NewFile
results in an identical copy of MYFILE in NewFile,
which is what I want.

I am really getting confused here. I am trying to figure out what character is making the darn thing stop prematurely.
I have tried flushing cout with cout.flush(), but that doesn't help.

the two _setmode lines effectively change the streams to binary mode. I know this because otherwise the program stops after 78 bytes of a 65K file. With the _setmode I get about 64K of the 65K.

I don't really care if my final solution uses STL <iostream> or  the standard C++ libraries <iostream.h>, but I don't want to use getc() unless I really have to (call me difficult if you want!)



#include <malloc.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <wtypes.h>

void main ()
{
      using namespace std;
      TCHAR chr;
      _setmode( _fileno( stdin ), _O_BINARY );
      _setmode( _fileno( stdout ), _O_BINARY );
      while( (cin>>chr).good() )
            cout << chr;
      cout.flush();
      cerr << "done";
}
0
 
LVL 1

Accepted Solution

by:
Bonev earned 40 total points
ID: 1172437
Try this:
#include <malloc.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <wtypes.h>

void main ()
{
      using namespace std;
      _setmode( _fileno( stdin ), _O_BINARY );
      _setmode( _fileno( stdout ), _O_BINARY );
      int rd = 1;
      char buf[128];
      while( rd )
      {
            cin.read(&buf[0], sizeof(buf));
            rd = cin.gcount();
            cout.write(&buf[0], rd);
      }
      cout.flush();
      cerr << "done";
}
0
 
LVL 1

Author Comment

by:cmain
ID: 1172438
Hey hey,
Thanks very much.

I was wondering if you perhaps know why the extraction operators cannot be used? read and write do work perfectly.

Thanks.
Regards
-craig.

0
 
LVL 1

Expert Comment

by:Bonev
ID: 1172439
My personal opinion is that the operators are provided just for convenience.

0
 
LVL 11

Expert Comment

by:alexo
ID: 1172440
Can't it be done with the STL copy() function and iostream iterators?  That would look cleaner.
0

Featured Post

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
This article will show you some of the more useful Standard Template Library (STL) algorithms through the use of working examples.  You will learn about how these algorithms fit into the STL architecture, how they work with STL containers, and why t…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

785 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question