Pergunta

Ao usar iostream em C ++ no Linux, ele exibe a saída do programa no terminal, mas no Windows, ele só salva a saída para um arquivo stdout.txt. Como posso, no Windows, fazer a saída aparecer no console?

Foi útil?

Solução

Uma vez que você mencionou stdout.txt I google'd-lo para ver o que exatamente iria criar um stdout.txt; normalmente, mesmo com um aplicativo do Windows, a saída do console vai para o console alocado, ou nenhum lugar se não for alocado.

Assim, supondo que você está usando SDL (que é a única coisa que fez subir stdout.txt), você deve seguir o conselho aqui . Ou stdout freopen e stderr com "CON", ou fazer o outro vinculador / compilação Soluções Alternativas lá.

No caso da ligação é quebrada novamente, aqui é exatamente o que foi referenciado a partir libSDL:

Como posso evitar a criação de stdout.txt e stderr.txt?

"Eu acredito que dentro do projeto ++ que vem com SDL há um alvo SDL_nostdio> você pode construir o que faz o que quiser (TM) Visual C".

"Se você definir 'NO_STDIO_REDIRECT' e SDL recompilação, eu acho que vai resolver o problema." >> (Resposta cortesia de Bill Kendrick)

Outras dicas

Você pode adicionar um console para um aplicativo não-console do Windows usando o processo descrito no Adicionando Console I / O para um Win32 GUI App .

um tópico inteiro ao gamedev. líquida sobre o tema.

Para a depuração no Visual Studio você pode imprimir para o console de depuração:

OutputDebugStringW(L"My output string.");

Se você tiver um aplicativo de nenhum-console do Windows, você pode criar um console com o função AllocConsole. Uma vez criado, você pode escrever a ele usando os métodos normais std :: cout.

Primeiro, o compilador ou ambiente dev você está usando? Se o Visual Studio, você precisa fazer um projeto de aplicativo de console para obter a saída do console.

Em segundo lugar,

std::cout << "Hello World" << std::endl;

deve funcionar em qualquer aplicativo C ++ consola.

A função API AllocConsole o Windows irá criar uma janela do console para sua aplicação.

Se você estiver usando Visual Studio, é necessário modificar o propriedade de projeto : Propriedades de configuração -> Linker -> Sistema -.> SubSystem

Isso deve ser definido para: Console (/ SUBSYSTEM: CONSOLE)

Além disso, você deve mudar seu WinMain ser esta assinatura:

int main(int argc, char **argv)
{
    //...
    return 0;
}

Se você estiver usando Visual Studio, ele deve funcionar muito bem!

Aqui está um exemplo de código:

#include <iostream>

using namespace std;

int main (int) {
    cout << "This will print to the console!" << endl;
}

Certifique-se de que você escolheu um aplicativo de console Win32 ao criar um novo projeto. Ainda assim você pode redirecionar a saída do seu projeto para um arquivo usando a opção console (>>). Isso vai realmente redirecionar o tubo console longe do stdout ao seu arquivo. (Por exemplo, myprog.exe >> myfile.txt).

Eu desejo que eu não estou enganado!

Se usar subsistema: console ou subsistema: janelas tipo de depende de como você deseja iniciar seu aplicativo:

  • Se você usar o subsistema: console, então você obter todas as stdout escrito para o terminal. O problema é que, se você iniciar o aplicativo a partir do Menu Iniciar / Desktop, você (por padrão) obter um console que aparece, bem como a janela do aplicativo (que pode olhar muito feio).
  • Se você usar o subsistema: windows, você não terá stdout / stderr mesmo se você executar o aplicativo a partir de um DOS janela, Cygwin , ou outro terminal.

Se quiser que o caminho do meio, que é a saída para o terminal Se o aplicativo foi iniciado em um terminal, em seguida, siga o link que Lucas fornecido em sua solução ( http://dslweb.nwnexus.com/~ast/dload/guicon.htm )

Para referência, eu corri para este problema com um aplicativo que eu quero correr no modo modo ou de lote do Windows normal (isto é, como parte de um script), dependendo da linha de comando. Toda a diferenciação entre aplicativos de console e do Windows é um pouco bizarro para pessoas Unix!

O aplicativo deve ser compilado como um aplicativo de console do Windows.

Eu suponho que você está usando alguma versão do Visual Studio? Nas janelas, std::cout << "something"; deve escrever algo para uma janela do console se o seu programa está configurado nas configurações do projeto como um programa console.

Você não precisa necessariamente fazer qualquer alteração ao seu código (nem para alterar o tipo SUBSYSTEM). Se desejar, você também pode simplesmente tubulação stdout e stderr para um aplicativo console (um Windows versão do cat funciona bem).

Se estiver usando MinGW , adicionar uma opção, -Wl,subsystem,console ou -mconsole.

Há uma boa solução

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top