C++ Stream Buffer
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...
Use string streams. They are a special kind of stream using a memory buffer. Like this:
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
#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
Wout "Dormeur" NeirynckThe Delta Quadrant Development Page
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
Erik
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:
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
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
Wout "Dormeur" NeirynckThe Delta Quadrant Development Page
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;
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.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement
Recommended Tutorials
Advertisement