Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

baskuenen

C++ Stream Buffer

This topic is 6572 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I''m writing text to the screen using cout << The problem is that sometimes halfway writing an error occurs, and the previous text already written must be deleted and replaced by a nice error message. The solution is to buffer all text in a temp io buffer, clearing this buffer on errors. How do I create such a buffer, and how do I move data between this buffer and the cout? Extra info: - I don''t want to create temp files!!! It''s multi-user so this will slow it down and cause extra problems! - It must be for both Windows and Linux, using standard C++ iostream. This is a difficult problem, and I bet almost nobody can answer this one - so I need YOUR post...

Share this post


Link to post
Share on other sites
Advertisement
Use string streams. They are a special kind of stream using a memory buffer. Like this:

        
#include <strstream>
#include <iostream>

using namespace std;

int main()
{
strstream str;
// Replace this if you want to change your means of output

ostream& output = str;

output << "Executing critical function now...";
// Execute critical func here

int code = CriticalFunc();
if (code < 0) {
// Reset output stream

output.clear();
output.seekp(0);
// Write to output

output << "Error executing critical function" << '\0' << endl;
}
else {
output << "success" << '\0';
}

cout << output.str() << endl;

return 0;
}


For some reason, you have to append a '\0' character at the end or you will get all sorts of garbage in your input stream. Don't know if this is a bug or a 'feature' .

Also, I'm not sure if replacing the "ostream" with, say, cout, will work. I guess I should test this, but I'm too lazy .

Hope this helps,
Dormeur

Edited by - dormeur on July 19, 2000 4:10:21 AM

Share this post


Link to post
Share on other sites
Domeur, what compiler are you using? It seems to me that the need for ''\0'' is a bug in the C++ library that comes with your compiler? Rogue Wave''s implementation (that comes with Borland C++ 5.5) has some bugs for sure, and Visual C++''s implementation isn''t bug free either...

Erik

Share this post


Link to post
Share on other sites
I''m using VC++ 6.0, although I sometimes use the gcc compiler in Linux (don''t know the version). But I can''t remember ever having used stringstreams in Linux, so I''m still not sure if the ''\0'' is a bug or a feature. (But if you say it''s a bug, Erik, and since it''s written by M$, I believe you .)

On the other hand, I can think of some cases where having to append the ''\0'' might be useful. Suppose the strstream automatically appends the null terminator each time I write a string to it, it''ll print only the first string written to it. Like this:

    
strstream str;
int a = 10;
str << "The value of a is " << a << ".";


This code will only print "The value of a is", if the "strstream::operator <<" automatically appends ''\0'' to each string.

Still, I think it''s a bug in the strstream::str() method. It should append a null terminator in the return string. Hey Micro$oft guys, are you reading this?

Dormeur

Share this post


Link to post
Share on other sites
quote:
Original post by Dormeur
Still, I think it''s a bug in the strstream::str() method. It should append a null terminator in the return string. Hey Micro$oft guys, are you reading this?




It''s not a bug.. you need to end the string yrself with ends like

    

str << "Here " << a << ends;

Share this post


Link to post
Share on other sites
I seem to recall that strstream is defined as a "C"-style string buffer, thus requiring a null-termination, and sstream is a std::string buffer.

Share this post


Link to post
Share on other sites
Thanks a lot! So there really are people who can answer this

It looks like a nice method.
Will start implementation in a few minutes...

I been having problems with this for weeks, so thanks again

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!