Как вывести на консоль в 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, я погуглил, чтобы узнать, что именно создаст 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
Я думаю, вам все еще нужно перенаправить дескрипторы ввода-вывода, чтобы заставить его работать (как это делает пример с 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

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

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 при создании нового проекта. Тем не менее, вы можете перенаправить вывод вашего проекта в файл с помощью переключателя консоли (>>). Это фактически перенаправит консольный канал из стандартного вывода в ваш файл. (например, myprog.exe >> myfile.txt).

Хотел бы я не ошибаться!

person Galilyou    schedule 25.02.2009

Использование subsystem:console или subsystem:windows зависит от того, как вы хотите запустить свое приложение:

  • Если вы используете подсистему: консоль, вы получаете весь стандартный вывод, записанный на терминал. Проблема в том, что если вы запускаете приложение из меню «Пуск/Рабочий стол», вы (по умолчанию) получаете консоль, а также окно приложения (которое может выглядеть довольно уродливо).
  • Если вы используете 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
Нет, тот отправляет на стандартный вывод - а тот не всегда пишет в консоль (в зависимости от того, как она распределена). Отсюда вопрос ОП и причина, по которой я прочитал эту ветку почти два года спустя! :-) - 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 молча игнорировала стандартный вывод - person Priyank; 22.06.2020

Я предполагаю, что вы используете какую-то версию Visual Studio? В окнах 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