Skip to main content
GameDev.net gamedev.net
🔒 Locked

C++: No output from cout object

Started by JohnsonGPS Apr 28, 2009 at 6:51 PM 11 replies 7.4k views
Original Post
JohnsonGPS
JohnsonGPS
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 using namespace std; void CTest::Dump (void) { cout << "\r\n Test the water!"; }
SiCrane
SiCrane
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);
rozz666
rozz666
Try this:
std::cout << "\r\n Test the water!" << std::flush;
Prefect
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.
Widelands - laid back, free software strategy
JohnsonGPS
JohnsonGPS
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"));

JohnsonGPS
JohnsonGPS
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.
visitor
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.

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?
Nitage
Nitage
You need a debugger attched if you want to see output from OutputDebugString - did you start the program in debug mode from the IDE?
juturnas
juturnas
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.
Drew_Benton
Drew_Benton
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).
adeyblue
adeyblue
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.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.