Как да изведа към конзолата в C++/Windows

Когато използвате iostream в C++ на Linux, той показва изхода на програмата в терминала, но в Windows той просто записва изхода във файл stdout.txt. Как мога в Windows да направя изхода да се показва в конзолата?


person Xunil    schedule 25.02.2009    source източник
comment
Къде е stdout.txt? Във вашата изходна папка?   -  person Kyle Delaney    schedule 21.04.2018


Отговори (13)


Тъй като споменахте stdout.txt, го намерих в Google, за да видя какво точно ще създаде stdout.txt; обикновено, дори и с Windows приложение, конзолният изход отива към разпределената конзола или никъде, ако такава не е разпределена.

Така че, ако приемем, че използвате SDL (което е единственото нещо, което извежда stdout.txt), трябва да следвате съвета тук. Или freopen stdout и stderr с "CON", или направете други заобиколни решения за свързване/компилиране там.

В случай, че връзката се счупи отново, ето точно какво е посочено от libSDL:

Как да избегна създаването на stdout.txt и stderr.txt?

„Вярвам, че в проекта Visual C++, който идва със SDL, има цел SDL_nostdio > можете да изградите, която прави това, което искате (TM).“

„Ако дефинирате „NO_STDIO_REDIRECT“ и прекомпилирате SDL, мисля, че това ще реши проблема.“ > > (Отговорът е предоставен с любезното съдействие на Бил Кендрик)

person MSN    schedule 25.02.2009
comment
Благодаря много! Това ме дразни от доста време - person Kenny Cason; 03.01.2011

За отстраняване на грешки във Visual Studio можете да отпечатате в конзолата за отстраняване на грешки:

OutputDebugStringW(L"My output string.");
person Sean    schedule 21.06.2013

Ако имате Windows приложение без конзола, можете да създадете конзола с функцията AllocConsole. Веднъж създаден, можете да пишете в него, като използвате нормалните методи std::cout.

person Community    schedule 25.02.2009
comment
Мисля, че все пак трябва да пренасочите io дескрипторите, за да го накарате да работи (както прави примерът с guicon). Или вместо това просто използвайте OutputDebugString. - person rogerdpack; 20.03.2011

Ако използвате Visual Studio, трябва да промените свойството на проекта: Свойства на конфигурацията -> Линкер -> Система -> Подсистема.

Това трябва да бъде зададено на: Конзола (/SUBSYSTEM:CONSOLE)

Също така трябва да промените своя WinMain, за да бъде този подпис:

int main(int argc, char **argv)
{
    //...
    return 0;
}
person Brian R. Bondy    schedule 25.02.2009

Функцията AllocConsole на Windows API ще създаде конзола прозорец за вашето приложение.

person jeffm    schedule 25.02.2009

Ако използвате Visual Studio, трябва да работи добре!

Ето примерен код:

#include <iostream>

using namespace std;

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

Уверете се, че сте избрали конзолно приложение Win32, когато създавате нов проект. Все пак можете да пренасочите изхода на вашия проект към файл, като използвате превключвателя на конзолата (>>). Това всъщност ще пренасочи канала на конзолата от stdout към вашия файл. (например myprog.exe >> myfile.txt).

Дано не греша!

person Galilyou    schedule 25.02.2009

Дали да използвате subsystem:console или subsystem:windows зависи от това дали искате да стартирате приложението си:

  • Ако използвате subsystem:console, тогава получавате целия stdout, записан на терминала. Проблемът е, че ако стартирате приложението от Start Menu/Desktop, вие (по подразбиране) получавате конзола, както и прозорец на приложението (което може да изглежда доста грозно).
  • Ако използвате subsystem:windows, няма да получите stdout/stderr дори ако стартирате приложението от DOS прозорец, Cygwin или друг терминал.

Ако искате средният път, който е да изведете към терминала, АКО приложението е стартирано в терминал, следвайте връзката, предоставена от Люк в неговото решение (http://dslweb.nwnexus.com/~ast/dload/guicon.htm)

За справка, срещнах този проблем с приложение, което искам да стартирам или в нормален режим на Windows, или в пакетен режим (т.е. като част от скрипт) в зависимост от превключвателите на командния ред. Цялата разлика между конзолни и Windows приложения е малко странна за хората от Unix!

person AJ.    schedule 11.11.2009
comment
Трябва да промените малко примера във връзката: заменете AllocConsole() с AttachConsole(ATTACH_PARENT_PROCESS), за да извеждате към същата конзола, която стартира приложението, ако приложението е стартирано на конзола. Ако не, тази функция ще върне 0. - person Ruud; 11.03.2010
comment
Бихте ли ме насочили към документацията на MSDN, където е дефинирана Ако използвате subsystem:windows, няма да получите stdout/stderr - person N0dGrand87; 17.05.2018

Първо, какъв компилатор или среда за разработка използвате? Ако е Visual Studio, трябва да направите проект за конзолно приложение, за да получите конзолен изход.

Второ,

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

трябва да работи във всяко C++ конзолно приложение.

person crashmstr    schedule 25.02.2009
comment
Не, това изпраща към стандартния изход - и това не винаги пише в конзолата (в зависимост от това как е разпределено). Оттук и въпросът на OP и причината да прочета тази тема почти две години по-късно! :-) - person winwaed; 13.01.2011

Вашето приложение трябва да бъде компилирано като конзолно приложение на Windows.

person spoulson    schedule 25.02.2009

Има добро решение

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();
person YuryChu    schedule 29.04.2018
comment
Благодаря за този коментар. По-новата ми версия на VS мълчаливо игнорираше stdout - person Priyank; 22.06.2020

Предполагам, че използвате някаква версия на Visual Studio? В Windows std::cout << "something"; трябва да напише нещо в конзолен прозорец, АКО вашата програма е настроена в настройките на проекта като конзолна програма.

person Rob K    schedule 25.02.2009

Ако използвате MinGW, добавете опция -Wl,subsystem,console или -mconsole.

person Jarekczek    schedule 17.06.2012

Не е задължително да правите промени в кода си (нито да променяте типа SUBSYSTEM). Ако желаете, можете също така просто да проводите stdout и stderr към конзолно приложение (Windows версията на cat работи добре).

person jamesdlin    schedule 05.08.2013