Sign in to follow this  
JohnsonGPS

C++: No output from cout object

Recommended Posts

JohnsonGPS    109
I am using Visual C++ 2008 Express Edition, and I am new to it. Just to test the water, I wrote a simple Windows Form application. I also use cout object to output some strings. When I debugged it in IDE, I saw no string being outputted to the debug window of the IDE. When I ran the application from command windows, I didn't see any outputs in the command windows as well. So where the strings go? Any thought? Thank you! The codes are very simple: #include <iostream> using namespace std; void CTest::Dump (void) { cout << "\r\n Test the water!"; }

Share this post


Link to post
Share on other sites
SiCrane    11839
By default std::cout outputs to the standard output handle. However, an application running in the Windows subsystem doesn't have standard out hooked up to anything. You could create a console with AllocConsole() and then redirect standard out to that console window. Ex:

AllocConsole();
freopen("conin$","r",stdin);
freopen("conout$","w",stdout);
freopen("conout$","w",stderr);

Share this post


Link to post
Share on other sites
Prefect    373
To expand on rozz' post: Most likely, your strings are caught in some stream buffer which is not being flushed at exit of your program.

Using std::flush flushes these buffers explicitly. Outputting std::endl flushes the buffers implicitly (and creates a linebreak).

Finally, note that "\r\n" is non-standard. If your streams are opened in text mode (which they should be), a single "\n" will do the job, though it is more idiomatic to use std::endl.

Share this post


Link to post
Share on other sites
JohnsonGPS    109
Thank you fopr your help. Here aqre some updates.

1) Method 1 works.
AllocConsole();
freopen("conin$","r",stdin);
freopen("conout$","w",stdout);
freopen("conout$","w",stderr);
printf ("\r\n Test");


2) Method 2 passed the compilation, but still no output
OutputDebugString (_T("\r\nTest"));

Share this post


Link to post
Share on other sites
JohnsonGPS    109
Quote:
Original post by Prefect
To expand on rozz' post: Most likely, your strings are caught in some stream buffer which is not being flushed at exit of your program.

Using std::flush flushes these buffers explicitly. Outputting std::endl flushes the buffers implicitly (and creates a linebreak).

Finally, note that "\r\n" is non-standard. If your streams are opened in text mode (which they should be), a single "\n" will do the job, though it is more idiomatic to use std::endl.


I tried both std::endl and std::flush, and one of them could make the outputs visible. Thanks anyway.

Share this post


Link to post
Share on other sites
visitor    643
I wonder though, why would the program exit so abruptly that flushing is necessary. If it is for debugging, then you could use std::cerr which should flush each output automatically.

Quote:

though it is more idiomatic to use std::endl


Is it, seeing that is doing more than is usually needed (flushing the stream) and is more to type?

Share this post


Link to post
Share on other sites
Nitage    1107
You need a debugger attched if you want to see output from OutputDebugString - did you start the program in debug mode from the IDE?

Share this post


Link to post
Share on other sites
juturnas    136
Quote:
Is it, seeing that is doing more than is usually needed (flushing the stream) and is more to type?


I would say more idiomatic yes, efficient no.

Share this post


Link to post
Share on other sites
Drew_Benton    1861
Quote:
I wrote a simple Windows Form application


You created a Windows Forms Application from the CLR tab. You should be creating a Win32 Console Application or Win32 Project under the Win32 tab.

I just tested using a CLR project and got the same results as you did with OutputDebugString failing to output. I don't know why that's the case, but it works under normal Win32 projects just fine. I would suggest you recreate your project as a Win32 Console project unless you are intentionally wanting to use a CLR styled project (which I would think you aren't after that at this point).

Share this post


Link to post
Share on other sites
theOcelot    498
Quote:
Original post by visitor
I wonder though, why would the program exit so abruptly that flushing is necessary. If it is for debugging, then you could use std::cerr which should flush each output automatically.


Seriously? Wish I'd known that about a year ago.

Share this post


Link to post
Share on other sites
adeyblue    549
Quote:
Original post by Drew_Benton
I just tested using a CLR project and got the same results as you did with OutputDebugString failing to output. I don't know why that's the case, but it works under normal Win32 projects just fine.


VS only attaches the managed debugger to /clr:pure projects by default. The native portion of the debugger needs to be attached for OutputDebugString to be effective. Switch the
Project Properties->Configuration Properties->Debugging->Debugger Type option to Mixed and it'll work.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this