Solved

simple cin/cout ?

Posted on 1998-09-10
12
556 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

On Demand Webinar: Networking for the Cloud Era

Ready to improve network connectivity? Watch this webinar to learn how SD-WANs and a one-click instant connect tool can boost provisions, deployment, and management of your cloud connection.

Question has a verified solution.

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

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
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 how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

691 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