Why does my program's output flash and close in Windows? - c

I'm trying to build an .exe file for the K&R "Hello, world". The code given in the book is:
#include <stdio.h>
main()
{
printf("Hello, world!\n");
}
When I build & run from Code::Blocks (under Windows XP), I get the prompt window with the "hello world" message. It stays open until I close it manually. However, when I double click the .exe file, the prompt just flashes and disappears, why is that?

No one is explicitly telling you this, so I will:
What you see when you double-click the file is normal. What your IDE does (keeping the window open) is a feature to help you debug the application.
Why is this so?
Since you're developing a console application, there has to be a console for your application to display its output on. If there is none yet, a new console is created (which is the black window).
If you launch your program from inside a console (say, from cmd.exe), it will just inherit the console of the parent without creating a new one[1].
After the last application using the console exits (which, in the first case is just your program), the console closes. You will notice this all the time for console applications that print nothing but a help text when run without parameters. If you double-click them from explorer, a black window with some text will flash and then immediately close.
Sometimes, a program that does something and them immediately closes is what you want. For example, you can call these applications from scripts.
On the other hand, your application could be interactive: waiting for user input, doing some thing, and only exiting when the user tells it to. You cannot script these applications, obviously, as you will need to have a human present at the keyboard to tell the application what to do.
Now we get to the IDE part: let's say you're developing an application of the first kind, one that does something and then immediately closes. It's not very convenient to have the screen flash and disappear every time you run it, because how can you tell if the program worked? Assuming you can tell this from the output it generates.
You could of course start a command-line window and run the application from there, but the program would execute separately from the IDE, and you would lose live debugging capabilities.
So, IDE makers came up with a feature for console applications: when you run the application directly from your IDE, they afterwards, usually waiting for a keypress. This gives you the opportunity to inspect the window with the output, to confirm that the application is working properly.
[1] Esoterica: unless you go through an application that does not inherit the console. Any console app launched by that application will not inherit the console, since the inheritance was broken by the GUI app. For example, start.exe does this. Compare:
foo.exe (inherits the console)
start foo.exe (start.exe is a GUI app, so foo.exe is launched in a new console)

If you're not running a command line exe from an already open command line window, Windows will automatically close the windows after the program has terminated. Try opening cmd.exe, navigating to your program's directory and running it from there, the window should stay open.

When running from IDE's like this, they run the program and when its done running, they close it.
Since your program's only function is to print out a value, it does that and closes.
You should try to add something that asks for user input at the end or compile it into an .exe and run itself from the command line yourself.
Since you are starting I would recommend to just run it from the command line yourself. You will eventually learn about user input and there you can have the command line window open when you use your program.

Normal behavior.
Your program executes every action in the order of the main. So it prints, and then moves on to the next operation, there is none, so it exits. Since the console window is tied to your .exe, the command window closes with the program.
If you don't want your program to exit right away, you can make it sleep, or wait for user input before exiting.

When double clicking a .exe in Windows, you are launching a new process. Windows has 2 basic process types: Window and Command line. The hello world sample you've written is a command line process.
A command line process will launch a new command window on startup. This is the window that pops up which is largely a black background with white text. Upon completion of a program the window will close down.

Add getch(); before the closing brace. This will prompt for an input after the output is printed. Once you key in a character the window will close. This should solve your problem.

The preferred solution is to run the executable from the command line.

Try running your binary from the command line.

That is because the executable file opens its own dialog box. When the executable has completed running it shuts down the dialog box that it opened in order to run. However, when YOU are the one that opened the dialog box, it disappears when YOU close it.
So if you were to open up a command prompt and then run the executable, the dialog box would not automatically close.

That is because from the executable, it executes your code in a new window and then the process is done, it has no reason to stay open, what you wanted to do is complete. There are a couple of things you can do. You can execute it from the cmd.exe command line, or you could even put something at the end of your code that listens for a key press, and once the key stroke is detected, allow the program to exit.

just add
system("pause");
line before return. it`s not the best, but universal method.

Here is my take on this:
// Hello sweetie (Spoilers)
#include <iostream>
using namespace std;
int main()
{
// Print the text to screen
cout << "************************************";
cout << "\n";
cout << "Hello World!";
cout << "\n";
cout << "You may close me by pressing Enter";
cout << "\n";
cout << "************************************";
cout << "\n";
cout << "\n";
/*
This will prompt for an input after the output is printed.
Once you hit the Enter key the window will close.
*/
if (cin.get() == '\n')
return 0;
}

Related

How do I make a C executable for Windows written on Linux not close the cmd as soon as it finishes running?

So, I've written a C executable on Linux for Windows using mingw32-gcc. It is a basic Input-Output program, you type an input and get an answer.
Problem is the cmd shuts down immediately, so the user can't see the output.
Assuming I cannot use Windows to edit the executable there, what should I change in my code/ what flags should I use when compiling it?
inb4:
the user is supposed to click and run it, so running it from cmd won't help.
adding getchar()/scanf() at the end of my code doesn't work, and it feels a bit like cheating.
SOLVED: so all I had to do was to actually add a getchar() after every scanf() and one more at the end of the code for the user input to close the cmd.
Waiting for input at the end is not cheating, but common practice. How else should program know for how long it should stay opened? Closing program by closing console window directly is more cheating than waiting for user input to finish.
You can for example prompt user to hit any key like Press any key to exit... or something similar.
If you want some specific delay, you can use Sleep() from windows.h instead of waiting for input.
See https://stackoverflow.com/a/3379146/3035795

Preventing console window from closing in Visual Studio

I have a problem with a project in Visual Studio. The project is created as an empty project, and then a .c file was added. The problem is that the console closes immediately after the program ends when I redirect input to a file.
I tried going to Properties > Linker > System and selecting /SUBSYSTEM:CONSOLE option, but it doesn't solve this. This always worked for me, but now when I redirected the input, the console closes right after the program execution and I can't see the output.
I redirected the output by adding <"in.txt" in Configuration properties > Debugger > Command, and it works exactly the way I wanted, except the console closes too soon. This problem doesn't occur when I redirect the output.
Also using getchar(), scanf(...) or system("pause") didn't work.
I would love to solve this by only changing some project settings and without adding some extra code to a program if possible, but any solution is appreciated.
Edit: As I stated above, I have tried several things, including some answers from similar questions, but none of them helped.
It's standard windows behavior that a console program automatically gets a new console window when not started from an existing one and this new window is automatically closed as soon as the program ends. So the key to force the window to stay open from withing your program is to prevent program termination.
With things like getchar(), you rely on the fact that these calls block until more input is available. This works fine as long as input actually comes from the console. But when you redirect input to come from a file, there will always be input available -- either there's more to read from the file or you'll instantly get an error (e.g. for EOF). That's the reason all these "tricks" don't work any more.
A simple and very unclean version is to just add an empty loop to the end of your program, so it never exits. On the windows platform, this could be something like
for (;;) Sleep(1000);
The call to Sleep() (include windows.h to use it) makes sure this loop doesn't burn CPU cycles. You'll have to forcefully end your program by hitting Ctrl+C or closing the window. Of course, don't leave this loop in your final program, it would be quite annoying when started from an existing console window.
There might be better solutions to this problem, but I hope I could explain you why this is happening.

Breaking out of Infinite C++ loop in codeblock

I am running a program written in C++ in Codeblocks in Windows. The major part of the program is structured like this:
while(true){
// do and print something
if (<something happens>)
break;
// do something
}
The problem is it takes a long time for the program to run in the windows cmd (which opens when I press the "build and run" option in Codeblocks). I would like to "stop" the output on the window and see the stuff that has been printed so far. How can I do the same? (If I press Ctrl + C, then it simply exits the window.)
With adding to pressing the pause button to stop command prompt, you could also extend the amount of viewable lines for future use.
More lines in command window

Prevent command prompt from closing after the code run

I have Microsoft Visual Studio and after I write a code and debug it the command prompt closes directly after the code run. Then I used
getc(stdin)
getch()
But all these also closes it after a click, Is there anyway to unable it from closing untill I click X?
There is an option to keep the output window open after run is finished, though it's pretty similar to what you did(adds a "Press any key to continue . . .")
If you want just to hold the window just add at the end
Sleep(100000000);
It will hold the window for this many mili seconds.
If it's still not enough do
while(1)
{
Sleep(100000000);
}
It will hold the window indefinitely

How do you keep the console from closing after the program is done in C? [duplicate]

This question already has answers here:
Closed 13 years ago.
Possible Duplicate:
What is the Best Practice for Combating the Console Closing Issue?
How do you keep the console from closing after the program is done in C? When I try to search for it I find lots of stuff about C++ and other languages, but nothing for C. Also, even for C++ there doesn't seem to be a definitive answer.
So could someone please let me know what the simplest way (doesn't need to be super elegant) way to keep the console open after a C program is done running?
The previous answers are all assuming that you want to invoke the console app and then essentially leave it "running" and waiting for user input to terminate. If this is the correct assumption, then +1 to GMan's answer. However, if you are asking how to invoke this console app from either a shortcut, Start->Run or some other mechanism and leave the cmd window open, then you will need to invoke it via cmd.exe itself with the /k option like so:
cmd.exe /k "foo.exe"
This will start a cmd window, run your console app, and then leave the cmd window open. This will address #Thanatos above. He's correct in that you should let the console app close. Again, for me it's unclear what you're really asking for what the end goal should be.
If I made the wrong assumption(s), feel free to -1 me.
run the program from the command
line, instead of executing it
directly.
Ctrl+F5 in Visual C++.
Console applications are meant to be run from the console. If you do that, after running you'll be left with your console window, and can easily view the output of your program.
You can use something like getchar() to force the application to wait for a key-press.
Let the console close.
If you prohibit, in the program, the console from closing, it will make automation with your program difficult, or it will make the format of the program's input strange.
Instead, fix whatever's running the program in the first place, to not close the terminal window in the first place. If this is MS Visual Studio, try F5 (Start without debugging). If you need debugging, place a breakmark at the program's end. Otherwise, open a command prompt/terminal and run the program there yourself.
1) Your IDE opens the console before the program begins.
2) your program ends
3) the IDE closes the console
a) Just tell the IDE to not close the console ... or
b) make your program not end.
a) No idea how to do it.
b) right before the return 0; used to terminate the program add
printf("Press ENTER a few times to terminate the program");
fflush(stdout);
getchar(); getchar(); getchar(); getchar();
getchar(); getchar(); getchar(); getchar();
return 0;
You could use getch() at the end of your program.
Another way is to debug the program and place a break point before the end of the program.

Resources