Come uscita per la console in C ++ / Windows
Domanda
Quando si utilizza iostream in C ++ su Linux, visualizza l'output del programma nel terminale, ma in Windows, solo salva l'output in un file stdout.txt. Come posso, in Windows, rendere l'output viene visualizzato nella console?
Soluzione
Dal momento che lei ha citato stdout.txt ho google'd per vedere che cosa esattamente creerebbe uno stdout.txt; normalmente, anche con un'applicazione di Windows, l'output della console va alla console assegnato, o da nessuna parte se non si è allocato.
Quindi, supponendo che si sta utilizzando SDL (che è l'unica cosa che ha portato fino stdout.txt), si dovrebbe seguire il consiglio qui . In entrambi i stdout e stderr freopen con "CON", o di fare l'altro linker / compilare soluzioni lì.
Nel caso in cui il collegamento si rompe di nuovo, qui è esattamente ciò che è stato fatto riferimento da libSDL:
Come faccio a evitare di creare stdout.txt e stderr.txt?
"Credo che all'interno del progetto di Visual C ++ che viene fornito con SDL c'è un bersaglio SDL_nostdio> si può costruire, che fa quello che si vuole (TM)".
"Se si definisce 'NO_STDIO_REDIRECT' e ricompilare SDL, penso che risolverà il problema." >> (Risposta per gentile concessione di Bill Kendrick)
Altri suggerimenti
È possibile aggiungere una console a un'applicazione non da console di Windows utilizzando il processo descritto in Aggiunta Console I / O a una Win32 GUI App .
C'è un intero thread su gamedev. rete sul tema.
Per il debug in Visual Studio è possibile stampare alla console di debug:
OutputDebugStringW(L"My output string.");
Se si dispone di un'applicazione nessuno-console di Windows, è possibile creare una console con il AllocConsole la funzione. Una volta creato, è possibile scrivere ad esso utilizzando i normali metodi di std :: cout.
Prima di tutto, ciò che compilatore o ambiente dev stai usando? Se Visual Studio, è necessario effettuare un progetto di applicazione di console per ottenere l'output della console.
In secondo luogo,
std::cout << "Hello World" << std::endl;
dovrebbe funzionare in qualsiasi applicazione console C ++.
Il AllocConsole funzione API di Windows creare una finestra di console per l'applicazione.
Se sei utilizzando Visual Studio è necessario modificare il proprietà del progetto : Proprietà di configurazione -> Linker -> Sistema -.> SubSystem
Questo dovrebbe essere impostato su: Console (/ SUBSYSTEM: CONSOLE)
Inoltre si dovrebbe cambiare la WinMain essere questa firma:
int main(int argc, char **argv)
{
//...
return 0;
}
Se si utilizza Visual Studio, dovrebbe funzionare bene!
Ecco un esempio di codice:
#include <iostream>
using namespace std;
int main (int) {
cout << "This will print to the console!" << endl;
}
Assicurati si è scelto un'applicazione console Win32 quando si crea un nuovo progetto. Ancora è possibile reindirizzare l'output del progetto in un file utilizzando il comando della consolle (>>). Questo effettivamente reindirizzare il tubo console lontano dal stdout al file. (Per esempio, myprog.exe >> myfile.txt
).
Vorrei non mi sbaglio!
Se utilizzare sottosistema: console o sottosistema: finestre tipo di dipende dal fatto che come si desidera avviare l'applicazione:
- Se si utilizza sottosistema: console, quindi si ottiene tutto lo stdout scritta al terminale. Il problema è che se si avvia l'applicazione dal menu Start / Desktop, è (per impostazione predefinita) ottiene una console che appare così come la finestra dell'applicazione (che può guardare piuttosto brutto).
- Se si utilizza sottosistemi: le finestre, non sarà possibile ottenere output / error anche se si esegue l'applicazione da un DOS finestra, Cygwin o altro terminale.
Se si desidera che la via di mezzo, che è quello di uscita al terminale se l'applicazione è stata avviata in un terminale, quindi seguire il link che Luca fornito nella sua soluzione ( http://dslweb.nwnexus.com/~ast/dload/guicon.htm )
Per avere un riferimento, mi sono imbattuto in questo problema con un'applicazione che voglio correre in entrambe le normali modalità di registrazione o in batch di Windows (cioè come parte di uno script) a seconda della riga di comando. Tutta la differenziazione tra applicazioni console e Windows è un po 'strano per la gente Unix!
La candidatura deve essere compilata come un'applicazione di console di Windows.
Presumo che si sta utilizzando una qualche versione di Visual Studio? In Windows, std::cout << "something";
dovrebbe scrivere qualcosa per una finestra di console se il programma è configurato nelle impostazioni del progetto come un programma di console.
Non è necessariamente bisogno di apportare modifiche al codice (né di modificare il tipo di SUBSYSTEM
). Se si desidera, è anche possibile semplicemente tubo stdout e stderr per un'applicazione console (un Windows versione di cat
funziona bene).
Se si utilizza MinGW , aggiungere un'opzione, -Wl,subsystem,console
o -mconsole
.
if (AllocConsole() == 0)
{
// Handle error here. Use ::GetLastError() to get the error.
}
// Redirect CRT standard input, output and error handles to the console window.
FILE * pNewStdout = nullptr;
FILE * pNewStderr = nullptr;
FILE * pNewStdin = nullptr;
::freopen_s(&pNewStdout, "CONOUT$", "w", stdout);
::freopen_s(&pNewStderr, "CONOUT$", "w", stderr);
::freopen_s(&pNewStdin, "CONIN$", "r", stdin);
// Clear the error state for all of the C++ standard streams. Attempting to accessing the streams before they refer
// to a valid target causes the stream to enter an error state. Clearing the error state will fix this problem,
// which seems to occur in newer version of Visual Studio even when the console has not been read from or written
// to yet.
std::cout.clear();
std::cerr.clear();
std::cin.clear();
std::wcout.clear();
std::wcerr.clear();
std::wcin.clear();