Когато използвате iostream в C++ на Linux, той показва изхода на програмата в терминала, но в Windows той просто записва изхода във файл stdout.txt. Как мога в Windows да направя изхода да се показва в конзолата?
Как да изведа към конзолата в C++/Windows
Отговори (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, мисля, че това ще реши проблема.“ > > (Отговорът е предоставен с любезното съдействие на Бил Кендрик)
За отстраняване на грешки във Visual Studio можете да отпечатате в конзолата за отстраняване на грешки:
OutputDebugStringW(L"My output string.");
Ако имате Windows приложение без конзола, можете да създадете конзола с функцията AllocConsole. Веднъж създаден, можете да пишете в него, като използвате нормалните методи std::cout.
Ако използвате Visual Studio, трябва да промените свойството на проекта: Свойства на конфигурацията -> Линкер -> Система -> Подсистема.
Това трябва да бъде зададено на: Конзола (/SUBSYSTEM:CONSOLE)
Също така трябва да промените своя WinMain, за да бъде този подпис:
int main(int argc, char **argv)
{
//...
return 0;
}
Функцията AllocConsole на Windows API ще създаде конзола прозорец за вашето приложение.
Ако използвате 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 зависи от това дали искате да стартирате приложението си:
- Ако използвате subsystem:console, тогава получавате целия stdout, записан на терминала. Проблемът е, че ако стартирате приложението от Start Menu/Desktop, вие (по подразбиране) получавате конзола, както и прозорец на приложението (което може да изглежда доста грозно).
- Ако използвате subsystem:windows, няма да получите stdout/stderr дори ако стартирате приложението от DOS прозорец, Cygwin или друг терминал.
Ако искате средният път, който е да изведете към терминала, АКО приложението е стартирано в терминал, следвайте връзката, предоставена от Люк в неговото решение (http://dslweb.nwnexus.com/~ast/dload/guicon.htm)
За справка, срещнах този проблем с приложение, което искам да стартирам или в нормален режим на Windows, или в пакетен режим (т.е. като част от скрипт) в зависимост от превключвателите на командния ред. Цялата разлика между конзолни и Windows приложения е малко странна за хората от Unix!
Първо, какъв компилатор или среда за разработка използвате? Ако е Visual Studio, трябва да направите проект за конзолно приложение, за да получите конзолен изход.
Второ,
std::cout << "Hello World" << std::endl;
трябва да работи във всяко C++ конзолно приложение.
Вашето приложение трябва да бъде компилирано като конзолно приложение на 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();
Предполагам, че използвате някаква версия на Visual Studio? В Windows std::cout << "something";
трябва да напише нещо в конзолен прозорец, АКО вашата програма е настроена в настройките на проекта като конзолна програма.
Ако използвате MinGW, добавете опция -Wl,subsystem,console
или -mconsole
.
Не е задължително да правите промени в кода си (нито да променяте типа SUBSYSTEM
). Ако желаете, можете също така просто да проводите stdout и stderr към конзолно приложение (Windows версията на cat
работи добре).