Как выводить в консоль в C++ / Windows

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

Ответов (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, я думаю, это решит проблему». >> (Ответ любезно предоставлен Биллом Кендриком)

Ваше приложение должно быть скомпилировано как консольное приложение Windows.

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

При использовании MinGW добавьте параметр -Wl,subsystem,console или -mconsole .

Для отладки в Visual Studio вы можете распечатать в консоли отладки:

OutputDebugStringW(L"My output string.");

Вам не обязательно вносить какие-либо изменения в свой код (или менять SUBSYSTEM тип). При желании вы также можете просто направить stdout и stderr в консольное приложение ( cat хорошо работает версия для Windows ).

Есть хорошее решение

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();

Если у вас нет консольного приложения Windows, вы можете создать консоль с помощью функции AllocConsole . После создания вы можете писать в него, используя обычные методы std::cout.

Во-первых, какой компилятор или среду разработки вы используете? Если вы используете Visual Studio, вам нужно создать проект консольного приложения, чтобы получить вывод консоли.

Второй,

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

должен работать в любом консольном приложении C++.

Я полагаю, вы используете какую-то версию Visual Studio? В Windows std::cout << "something"; следует что-то записать в окно консоли, ЕСЛИ ваша программа настроена в настройках проекта как консольная программа.

Если вы используете Visual Studio, вам необходимо изменить свойство проекта : Свойства конфигурации -> Компоновщик -> Система -> Подсистема .

Это должно быть установлено на: Консоль (/ SUBSYSTEM: CONSOLE)

Также вы должны изменить свой WinMain на эту подпись:

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

Если вы используете Visual Studio, все должно работать нормально!

Вот пример кода:

#include <iostream>

using namespace std;

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

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

Я не ошибаюсь!

Независимо от того, использовать ли подсистему: консоль или подсистему: окна, зависит от того, как вы хотите запускать свое приложение:

  • Если вы используете subsystem: console, то весь стандартный вывод будет записан в терминал. Проблема в том, что если вы запускаете приложение из меню «Пуск» / рабочего стола, вы (по умолчанию) получаете консоль, а также окно приложения (которое может выглядеть довольно некрасиво).
  • Если вы используете subsystem: windows, вы не получите stdout / stderr, даже если вы запустите приложение из окна DOS , Cygwin или другого терминала.

Если вам нужен средний способ вывода на терминал, ЕСЛИ приложение было запущено в терминале, перейдите по ссылке, которую Люк предоставил в своем решении ( http://dslweb.nwnexus.com/~ast/dload/guicon. htm )

Для справки, я столкнулся с этой проблемой с приложением, которое я хочу запускать либо в обычном режиме Windows, либо в пакетном режиме (то есть как часть сценария) в зависимости от параметров командной строки. Вся разница между консольными и Windows-приложениями кажется немного странной для пользователей Unix!