First, I apologize for what must be in a FAQ somewhere that I haven't located. I have tried.
Here is the basic question (details below): How do I turn off canonical input processing on an arbritrary istream? Failing that, how do I do it with just cin using VC++ 7.1?
The gory details:
I am writing a function that is part of a larger project so I don't have a lot of control over the style of its parameters. It gets an istream and ostream pointer. With the istream pointer I have to read a character at a time as this is for an interactive application; I need to react to each character as it is entered, not after the entire line has been entered. Like an editor.
But if the istream is std::cin, then I have canonical line processing (no extra charge!) where the characters are echoed to the user, ^H (backspace) is interpreted, and nothing is available to the calling program until a newline has been entered.
If I compile under GCC 3.4.4, I can (with vast pain) determine that the istream is associated with file descriptor 0 (STDIN_FILENO) and use tcgetattr/tcsetattr to turn off the canonical processing.
But these functions (tcgetattr/tcsetattr) do not appear to be available in VC++ 7.1
I have looked for days for a general way to deal with this problem and either it is so obvious that nobody mentions it or I have completely missed it. Even the GCC documentation doesn't give a solution for itself (though I found one on the net). The VC++ documentation casually mentions that istream buffering can be turned off, but doesn't say how. Perhaps they were not referring to canonical processing but something else...
I have tried some of the obvious stuff already:
<pre>// Forcing cin to not do line-buffering and echoing<br />
#include <iosfwd><br />
#include <iostream><br />
using namespace std;<br />
int main(int argc, char *argv)<br />
char inChar;<br />
#if 0<br />
// compiles but input is still line-buffered<br />
#if 0<br />
// doesn't compile under cygwin g++ 3.4.4 or VC++ 7.1<br />// It was mentioned somewhere on the net so I had to try...<br />
#if 0<br />
// According to MS, cin is really an ostream (!), so...<br />// compiles but input is still line-buffered (wasn't really expecting much)<br />
cin >> unitbuf;<br />
#if 0<br />
// compiles but input is still line-buffered (wasn't really expecting much)<br />
if(inChar == '\004') break;<br />
cout << "\nRead in '" << inChar << "'\n" << flush;<br />
If I want to process a std::vector using a reverse_iterator (because the element I'm looking for is likely to be near the end), how do I remove the element from the vector after I locate it?
typedef std::vector<GROUP_HANDLE> GroupHandleList;
bool done = false;
for ( i = GHList->rbegin(); !done && i != GHList->rend(); i++ )
GROUP_HANDLE gi = *i;
if ( gi == hGroup )
// ?? I want to call:
// but that requires an 'iterator', not a 'reverse_iterator'
done = true;
Robert Edward Caldecott wrote: 'Wow!'. What a fantastic library!
Robert Edward Caldecott wrote: Can anyone give me some quick Boost recommendations?
It really depends on the nature of your projects. I am currently involved with text processing libraries, and thus mostly use regex, lexical_cast and tokanizer, and looking forward to using string_algo.
Also, I make a heavy use of smart pointers, tuple and test, and to a lesser extent filesystem, bind and graph.
<a href = http://www.codeproject.com/script/profile/whos_who.asp?id=14112#Blog> My programming blahblahblah blog. If you ever find anything useful here, please let me know to remove it.
You should definitely take a look at boost::bind and boost::signal, I use them all the time. I recently started using boost::serialization and boost::regex. Both are simple to use and extremely powerful.
You don't think smart pointers are useful? You don't think for_each is useful? Aaahh ... I see from previous posts that you actually think STL is "bloatware". What a shame. Other than the fact that both STL and Boost are incredibly powerful, I need to write code for Windows AND Linux, and without these libraries, this would be difficuly to achieve.
Elegant enough IMO, though people seem to either love or hate typedef. Using smart pointers in containers is very useful, and from experience, it has meant more time concentrating on the job at hand instead of tracking down memory leaks. I did use the ATL7 CAutoPtr class (and associated CAtlArray/CAtlList) but that's no help for writing portable code plus I prefer using STL iterators over MFC's 'POSITION' scheme. Shrug.
Whatever works I guess. But the more I use STL/Boost, the more I wonder why I went so long without it!
Nishant Sivakumar wrote: Is Boost a full STL implementation?
No - it's not an STL implementation at all...apart from some of the things that are added at TR1 (like regex, smart pointers, function and some other stuff) and are so are not yet in any STL that you'll have access to). Really, if you consider Boost as a sandpit for libraries that are or could be potential additions to the Standard C++ library, you're not far wrong.
Also - Boost classes are all in the boost namespace or a child namespace of boost.
I'm writing WMI Instance/Method provider. Working in VS.NET 2003. ClassWiz generates some code for WMI Instance Provider, using IWbemInstProviderImpl class. I haven't managed to find any documentation about the wizard usage or about the class and classes discribed in the same header file.
Please, let me know, if someone knows where I can get some information about the stuff.
Thanks in advance.
Just a student!
Last Visit: 23-Jan-19 3:24 Last Update: 23-Jan-19 3:24