Usage of rdbuf

O

Omid

Hi.

I have a piece of code that can be compiled and linked both with
Cygwin g++ and with VC++. The code is:

//WORKS WITH CYGWIN G++
//BUT NOT WITH CL.EXE (VC++) (compiles, but error when executed)
//################################
#include <iostream>
#include <sstream>
using namespace std;

int main ()
{

int val;
string mystr;
stringstream ss (stringstream::in | stringstream::eek:ut);

cout.rdbuf(ss.rdbuf()); //Is this ok to do?
cout << "120 42 377 6 5 2000";

//If the two lines above are replaced with
//this line it works fine with both
//g++ and VC++:
//ss << "120 42 377 6 5 2000";

for (int n=0; n<6; n++)
{
ss >> val;
cerr << val*2 << '\n';
}

cerr << "Hello World! " << endl;
return 0;
}
//################################



My problem is that during run time the exe-file that was created with
Cygwin g++ (3.3.1) works fine, but the exe-file that was created with
VC++ 6.0 crashes.

Here is the error message:
The instruction at "0x00402f7f" referenced memory at "0x0000000sd".
The memory could not be "read".


Is there any errors in my code, or do I do something I'm not allowed
to?
Since it works in Cygwin g++, but not in VC++ 6.0 I think this is
really strange, since I believe that my code is 100% ANSI-C++ code. Or
is it?

I compile with:
G++: g++ test.cpp
VC++: cl /GX /TP test.cpp (also compiled with the entire VC++
development GUI)

I'm thankful for any information that might help me with this problem.

/Omid
 
J

John Harrison

Omid said:
Hi.

I have a piece of code that can be compiled and linked both with
Cygwin g++ and with VC++. The code is:

//WORKS WITH CYGWIN G++
//BUT NOT WITH CL.EXE (VC++) (compiles, but error when executed)
//################################
#include <iostream>
#include <sstream>
using namespace std;

int main ()
{

int val;
string mystr;
stringstream ss (stringstream::in | stringstream::eek:ut);

cout.rdbuf(ss.rdbuf()); //Is this ok to do?
cout << "120 42 377 6 5 2000";

//If the two lines above are replaced with
//this line it works fine with both
//g++ and VC++:
//ss << "120 42 377 6 5 2000";

for (int n=0; n<6; n++)
{
ss >> val;
cerr << val*2 << '\n';
}

cerr << "Hello World! " << endl;
return 0;
}
//################################



My problem is that during run time the exe-file that was created with
Cygwin g++ (3.3.1) works fine, but the exe-file that was created with
VC++ 6.0 crashes.

Here is the error message:
The instruction at "0x00402f7f" referenced memory at "0x0000000sd".
The memory could not be "read".


Is there any errors in my code, or do I do something I'm not allowed
to?
Since it works in Cygwin g++, but not in VC++ 6.0 I think this is
really strange, since I believe that my code is 100% ANSI-C++ code. Or
is it?

I compile with:
G++: g++ test.cpp
VC++: cl /GX /TP test.cpp (also compiled with the entire VC++
development GUI)

I'm thankful for any information that might help me with this problem.

/Omid

You must restore the old buffer before you exit.

streambuf* save_buffer = cout.rdbuf(ss.rdbuf()); //Is this ok to do?
cout << "120 42 377 6 5 2000";
cout.rdbuf(save_buffer);

john
 
D

DM McGowan II

Omid said:
Hi.

I have a piece of code that can be compiled and linked both with
Cygwin g++ and with VC++. The code is:

//WORKS WITH CYGWIN G++
//BUT NOT WITH CL.EXE (VC++) (compiles, but error when executed)
//################################
#include <iostream>
#include <sstream>
using namespace std;

int main ()
{

int val;
string mystr;
stringstream ss (stringstream::in | stringstream::eek:ut);

cout.rdbuf(ss.rdbuf()); //Is this ok to do?
cout << "120 42 377 6 5 2000";

//If the two lines above are replaced with
//this line it works fine with both
//g++ and VC++:
//ss << "120 42 377 6 5 2000";

for (int n=0; n<6; n++)
{
ss >> val;
cerr << val*2 << '\n';
}

cerr << "Hello World! " << endl;
return 0;
}
//################################



My problem is that during run time the exe-file that was created with
Cygwin g++ (3.3.1) works fine, but the exe-file that was created with
VC++ 6.0 crashes.

Here is the error message:
The instruction at "0x00402f7f" referenced memory at "0x0000000sd".
The memory could not be "read".


Is there any errors in my code, or do I do something I'm not allowed
to?
Since it works in Cygwin g++, but not in VC++ 6.0 I think this is
really strange, since I believe that my code is 100% ANSI-C++ code. Or
is it?

I compile with:
G++: g++ test.cpp
VC++: cl /GX /TP test.cpp (also compiled with the entire VC++
development GUI)

I'm thankful for any information that might help me with this problem.

/Omid

I just tried with VS.NET and it compiles and runs cleanly. You can download
the compiler for free http://msdn.microsoft.com/visualc/vctoolkit2003/.
 
O

Omid

John Harrison said:
You must restore the old buffer before you exit.

streambuf* save_buffer = cout.rdbuf(ss.rdbuf()); //Is this ok to do?
cout << "120 42 377 6 5 2000";
cout.rdbuf(save_buffer);

john

Thanks John!

That solved my problem.


/Omid
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top