2009-02-25 37 views
13

Khi sử dụng iostream trong C++ trên Linux, nó hiển thị đầu ra chương trình trong thiết bị đầu cuối, nhưng trong Windows, nó chỉ lưu đầu ra vào tệp stdout.txt. Làm thế nào tôi có thể, trong Windows, làm cho đầu ra xuất hiện trong giao diện điều khiển?Cách xuất ra bàn điều khiển trong C++/Windows

Trả lời

15

Vì bạn đã đề cập đến stdout.txt nên tôi sẽ google để xem chính xác những gì sẽ tạo ra một giá trị xuất chuẩn.txt; thông thường, ngay cả với một ứng dụng Windows, đầu ra của giao diện điều khiển sẽ chuyển đến bàn điều khiển được cấp phát hoặc không có nơi nào nếu không được cấp phát.

Vì vậy, giả sử bạn đang sử dụng SDL (đó là điều duy nhất đưa lên stdout.txt), bạn nên làm theo lời khuyên here. Hoặc là freopen stdout và stderr với "CON", hoặc thực hiện các giải pháp liên kết/biên dịch khác ở đó.

Trong trường hợp liên kết bị phá vỡ một lần nữa, đây là chính xác những gì đã được tham chiếu từ libSDL:

Làm thế nào để tránh tạo ra các stdout.txt và stderr.txt?

"Tôi tin rằng bên trong dự án Visual C++ đi kèm với SDL có một mục tiêu SDL_nostdio> bạn có thể xây dựng những gì bạn muốn (TM)."

"Nếu bạn xác định" NO_STDIO_REDIRECT "và biên dịch lại SDL, tôi nghĩ nó sẽ khắc phục được sự cố." >> (Trả lời lịch sự của Bill Kendrick)

+0

Cảm ơn rất nhiều! Điều này đã gây phiền nhiễu cho tôi một thời gian khá –

2

Ứng dụng của bạn phải được biên dịch dưới dạng ứng dụng bảng điều khiển Windows.

1

Tôi cho rằng bạn đang sử dụng một số phiên bản của Visual Studio? Trong cửa sổ, std::cout << "something"; nên ghi một cái gì đó vào cửa sổ bảng điều khiển NẾU chương trình của bạn được thiết lập trong cài đặt dự án dưới dạng chương trình bảng điều khiển.

4

Trước hết, bạn đang sử dụng trình biên dịch hoặc môi trường dev nào? Nếu Visual Studio, bạn cần tạo một dự án ứng dụng bảng điều khiển để có được đầu ra của bàn điều khiển.

Thứ hai,

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

nên làm việc trong bất kỳ ++ console ứng dụng C.

+5

Không, điều đó gửi đến đầu ra tiêu chuẩn - và điều đó không phải lúc nào cũng ghi vào bàn điều khiển (tùy thuộc vào cách nó được cấp phát). Do đó câu hỏi của OP, và lý do để tôi đọc chủ đề này gần hai năm sau đó! :-) – winwaed

4

Nếu bạn đang sử dụng Visual Studio bạn cần phải sửa đổi các tài sản dự án : Configuration Properties ->Linker ->Hệ thống ->Subsystem.

này nên được thiết lập để: Console (/ SUBSYSTEM: CONSOLE)

Ngoài ra bạn nên thay đổi WinMain của bạn để được chữ ký này:

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

Nếu bạn đang sử dụng Visual Studio, nó nên làm việc tốt!

Dưới đây là một ví dụ mã:

#include <iostream> 

using namespace std; 

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

Hãy chắc chắn rằng bạn đã chọn một giao diện điều khiển ứng dụng Win32 khi tạo một dự án mới. Tuy nhiên, bạn có thể chuyển hướng đầu ra của dự án của bạn đến một tệp bằng cách sử dụng công tắc điều khiển (>>). Điều này sẽ thực sự chuyển hướng các ống điều khiển từ stdout vào tập tin của bạn. (ví dụ: myprog.exe >> myfile.txt).

Tôi ước tôi không nhầm!

5

Nếu bạn có ứng dụng Windows không có giao diện điều khiển, bạn có thể tạo bảng điều khiển với chức năng AllocConsole. Khi đã tạo xong, bạn có thể viết nó bằng cách sử dụng các phương thức std :: cout bình thường.

+0

Tôi nghĩ bạn vẫn phải chuyển hướng các mô tả io để làm cho nó hoạt động (như ví dụ về guicon). Hoặc cách khác, bạn chỉ cần sử dụng OutputDebugString. – rogerdpack

4

Chức năng API AllocConsole sẽ tạo cửa sổ bảng điều khiển cho ứng dụng của bạn.

2

Cho dù sử dụng hệ thống con: giao diện điều khiển hoặc hệ thống con: cửa sổ loại phụ thuộc vào việc làm thế nào bạn muốn bắt đầu ứng dụng của bạn:

  • Nếu bạn sử dụng hệ thống con: giao diện điều khiển , sau đó bạn nhận được tất cả các stdout bằng văn bản cho thiết bị đầu cuối. Vấn đề là nếu bạn khởi động ứng dụng từ Start Menu/Desktop, bạn (theo mặc định) có giao diện điều khiển xuất hiện cũng như cửa sổ ứng dụng (có thể trông khá xấu xí).
  • Nếu bạn sử dụng hệ thống con: cửa sổ, bạn sẽ không nhận được stdout/stderr ngay cả khi bạn chạy ứng dụng từ một cửa sổ DOS, Cygwin hoặc thiết bị đầu cuối khác.

Nếu bạn muốn con đường trung đạo mà là đầu ra cho thiết bị đầu cuối NẾU các ứng dụng đã được bắt đầu tại một nhà ga, sau đó làm theo các liên kết mà Luke cung cấp trong giải pháp của ông (http://dslweb.nwnexus.com/~ast/dload/guicon.htm)

Để tham khảo, tôi chạy vào vấn đề này với một ứng dụng mà tôi muốn chạy trong chế độ Windows bình thường hoặc chế độ hàng loạt (nghĩa là, như một phần của một tập lệnh) tùy thuộc vào các công tắc dòng lệnh. Sự khác biệt hoàn toàn giữa giao diện điều khiển và các ứng dụng Windows là một chút kỳ lạ đối với những người Unix!

+1

Bạn cần thay đổi ví dụ trong liên kết một chút: thay thế AllocConsole() bằng AttachConsole (ATTACH_PARENT_PROCESS) để xuất ra cùng một giao diện điều khiển đã khởi động ứng dụng, nếu ứng dụng được khởi động trên bàn điều khiển . Nếu không, hàm này sẽ trả về 0. – Ruud

0

Nếu sử dụng MinGW, hãy thêm tùy chọn, -Wl,subsystem,console hoặc -mconsole.

5

Để gỡ lỗi trong Visual Studio bạn có thể in đến debug console:

OutputDebugStringW(L"My output string."); 
0

Bạn không nhất thiết cần phải thực hiện bất kỳ thay đổi mã của bạn (và cũng không thay đổi kiểu SUBSYSTEM). Nếu muốn, bạn cũng có thể chỉ cần pipe stdout and stderr to a console application (phiên bản Windows cat hoạt động tốt).

Các vấn đề liên quan