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?

È stato utile?

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.

C'è una buona soluzione

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top