|
Hmmm. I'm puzzled then. I think my VC++ has SP3 applied. perhaps that makes a difference? And I tried it on NT4.
Kevin
|
|
|
|
|
Thanks for your reply.
Even stranger! that you have VC++ 6, SP3 and claim it works for you, while I with VC++ 6, SP5, cannot get the kind of behavior I'm looking for.
The problem (it looks more and more to be), is that 'getline() isn't receiving any data from the input queue, because a 'cout' of the string (which is the input buffer) reveals NOTHING in it. Consequently, when the test is made to see if data is absent, the test succeeds because NO data has been collected and is the reason why the invalid segment gets activated.
So the problem doesn't seem to rest with 'string', but more with 'getline()'.
To be honest with you, 'getline()' has been a problem child for me every time I try to use it, and this time is no exception.
William
Fortes in fide et opere!
|
|
|
|
|
I dont understand why the comparison with three "?"
is it a desired input??
or is it the comparison for uninitialised junk string?
The World is getting smaller and so are the people.
|
|
|
|
|
Here is just a guess since I don't use string.
Try changing str=="" to str== " ". note the space.
Or the string should have an isempty() method I presume.
-Steve
|
|
|
|
|
Try using strcmp() . I've had problems trying to use normal logical operators on strings and char arrays before but using the different compare functions sure saved me from headaches.
The question "Do computers think?" is the same as "Can submarines swim?"
DragonFire Software
Jeryth
|
|
|
|
|
Thanks for your reply.
Because I've worked with 'string' so often, and have equally studied its syntaxes and member functions in the C++ Standard library so much as well, I can say that the authors of 'string' went above and beyond their call of duty to make it as robust as possible. Not only is this reflected in the ways they have tried to make it as seamless for backward compatibility when dealing with C-Style 'char*' string, but they have sought to expand it with features that the old C-Style string did not possess.
For example, the C++ Standard has overloaded the string comparison operators to accept three different kinds of comparisons when comparing std::strings.
1) a std::string with another std::string
2) a std::string with a C-Style char* cstr
3) a C-Style char* cstr with a std::string
Those operators represent, ==, !=, <, >, <=, and >=. So there is no need to use the old C-Style 'strcmp' or 'strncmp' functions (which deals specifically with C-Style char* strings) when working with std::string.
I believe the problem I'm experiencing, has more to do with 'getline()' than with 'strings'.
I've had so many problems in the past using 'getline()', that I shun it like the plague. It's a beast of its own kind that seems to operate like a renegade. It might have good qualities, but (for me) it doesn't seem to be very lending.
William
Fortes in fide et opere!
|
|
|
|
|
There is a known bug in the getline() VC 6.0 version (see MS KB #240015). This KB article has a "fix" which requires editing the string header file. It may not be related to the problem your having, but underscores your suspicions of getline().
By the way, it executes as expected in VS.NET 2003 without revision.
Regards
Mike
|
|
|
|
|
Thanks for your reply.
I'm looking into it. BTW, are you sure about that KB number?
Thanks.
William
Fortes in fide et opere!
|
|
|
|
|
Thanks for the tip.
I did locate the KB article and the string file to which the error refered. However, even after I had made the recommended change the article offered, the problem with 'getline()' still persist.
William
Fortes in fide et opere!
|
|
|
|
|
Move the cin, e.g.
char line[100];
cout << " Type a line terminated by 't'" << endl;
cin.getline( line, 100, 't' );
cout << line;
|
|
|
|
|
Thanks for replying.
Your suggestion has merit to it (perhaps) for a number of other situations, but for what I'm doing, unless I can engender a character (other than any printable character), using a special terminating character (as this form of 'getline()' requires) would not work for me.
For example, if I were to use "t" as my terminating character, there could very well be instances where I might need "t" as a single character to be by itself, which means when the 'getline()' function sees a single "t" standing by itself, it would interpret that single "t" as the terminating character and transfer the collected data from the input queue to the buffer, when in truth and fact, in that particular instance I did not mean for "t" to be a terminating character (it may have been meant to be data). This is especially true when dealing with scientific equations and formulas.
William
Fortes in fide et opere!
|
|
|
|
|
Then simply use: cin.getline( line, 100) for the example given. The DEFAULT will be '\n' (carriage return) added as the final character when the return (enter) key is pressed.
|
|
|
|
|
In case you haven't been reading the other posts, 'getline()' has a bug in it, and is unfit to use (at least for VC++ 6). Even the fix that MS has issued, DOES NOT WORK!!
Take my word for it, I am very acquainted with the various iostream member functions (including 'getline()') and the only reason why I posted the question on this forum, was in hope that somebody may have found a workaround for the problems this I/O function has been plagued with.
I understand VC++ 7 does not have this problem, and that is good news for those who might want to use it.
William
Fortes in fide et opere!
|
|
|
|
|
I have 6.00 and works fine for me, try this out:
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
int main(int argc, char* argv[])
{
char line[100];
cout << "Type a line" << endl;
cin.getline( line, 100);
if(strcmp(line, "xxx") == 0)
cout << "You entered xxx";
else
cout << "You did not enter xxx";
return 0;
}
|
|
|
|
|
Doing it the way you have you have to press the enter key twice after getline to get a response (the bug you were referring to). See http://support.microsoft.com/default.aspx?scid=kb;en-us;Q240015 for the fix ( the fix does work if you make the changes in the right file. The file referred to is in two different locations. You might as well change the code in both: MicrosoftVisualStudio\VC98\Include\String and MicrosoftVisualStudio\VC98\CRT\SRC\String I did and the enter key only has to be pressed once now and the code below which is like your way of doing it works fine.
#include "stdafx.h"
#include "string"
#include "iostream"
using namespace std ;
int main(int argc, char* argv[])
{
string s1;
cout << "Enter a sentence:";
getline(cin,s1);
if(s1 == "???" || s1 == "")
cout << "First case";
else
cout << "Second case";
return 0;
}
|
|
|
|
|
I just bought a PocketPC today. I wonder if I can use
VC++ to write programs for it? How do I develop applications
on the PocketPC? Where can I download the SDK for PocketPC?
I'm using VS.Net 2003, I wonder if there is a built-in tool
that I can develop applications on the PocketPC?
Thanks.
|
|
|
|
|
What kind of operating system is installed in you pocket pc?
The World is getting smaller and so are the people.
|
|
|
|
|
The OS is Windows Mobile 2003.
|
|
|
|
|
humm, well only think i can suggest is to get the sdk of that os.
I dont know wheather that is available in .net coz i have not yet moved to .net
The World is getting smaller and so are the people.
|
|
|
|
|
You ought to be able to use VC++ .NET 2003 with the Mobile Web Forms library. Presumably you should also be able to write native code for it. But I don't know whther there's a non-.NET library for this purpose? Some may use libraries such as WTL, as this is relatively lightweight and fast, I gather.
Kevin
|
|
|
|
|
How to Bind FRAME'S SCROLL MESSAGE to CMyControl's SCROLL MESSAGE?
that is :
1)How can I send FRAME's message-'WM_HSCROLL'(including position information) to CMyControl(eg: ID:0x100)
to invoke its action
2)When I Move CMyControl's client,How to change the FRAME's ScrollBar's Position?
thanks!
Sorry for my pool English
|
|
|
|
|
Is there any way to control elements in an instance of IE,such as form.I want to click on a certain button in an IE window every time I open it.Hopefully someone can show it in details.
|
|
|
|
|
This task is quite complex:
1.
First you have to connect from your appp to running instances of IE in order to monitor it.
http://www.codeguru.com/ieprogram/enumIE.html[^]
2.
You have to parse every document in every running instance of IE and search for your form in the documents. For this you can use MSHTML functions, first getting MSHTML::IHTMLDocument2, then call IHTMLDocument2::forms, which gives an IHTMLElementCollection of all forms in the document. Iterate through all forms IHTMLElement's (if there are many of them) by searching form some ID or name. If your form is found, create from the IDispatch pointer of the form's IHTMLElement an IHTMLFormElement, and finally call its submit function.
The above link also shows you how to get IHTMLDocument2 pointer of a running instance of IE, and all further steps are here.
Peter Molnar
|
|
|
|
|
I've edited this question...
How can I just return the HICON from system image list for HTML documents only?
Thanks
|
|
|
|
|
Is there any way to verify that the memory allocated by a program has been freed after the program closes?
I ran my program and used the Task Manager to view the memory usage. I also viewed the Allocated Memory and Available Memory. After I closed the program I expected the Available Memory to increase by the amount of memory usage that was associated with my program, but it didn't.
|
|
|
|