cmain
asked on
simple cin/cout ?
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.
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.
ASKER
I asked for an implementation using STL.
(Standard Template Library).
(Standard Template Library).
ASKER
I would also like to know the number of bytes that were piped into the application??
Thanks
-craig.
Thanks
-craig.
Why use the STL? Why not just use <iostream>?
#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;
}
int main()
{
unsigned char ch;
unsigned long count;
while ( (cin >> ch).good() )
{
++count;
cout << ch;
}
// optionally:-
cerr << "Transferred " << count << " bytes\n";
return 0;
}
ASKER
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.
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.
I believe that a stream can be switched between binary and text mode. But I can't see how at the moment.
ASKER
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";
}
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";
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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.
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.
My personal opinion is that the operators are provided just for convenience.
Can't it be done with the STL copy() function and iostream iterators? That would look cleaner.
int main(void)
{
char data;
while(fread(&data,1,1,stdi
{
printf("%c",data);
}
return (0);
}